工廠模式、工廠方法模式和抽象工廠模式的差異分析
工廠模式的好處就在於將工廠和產品之間的耦合降低,將具體產品的構造過程放在了具體工廠類裡面。在以後擴展產品的時候方便很多,只需要添加一個工廠類,一個產品類,就能方便的添加產品,而不需要修改原有的代碼。而在簡單工廠中,如果要增加一個產品,則需要修改工廠類,增加if/else分支,或者增加一個case分支,工廠模式符合軟體開發中的OCP原則(open close principle),對擴展開放,對修改關閉。
抽象工廠模式:這個模式我總是感覺和builder模式非常相似。
工廠方法模式提供的是對一個產品的等級模式,而抽象工廠方法提供的是對多個產品的等級模式,注意,這裡的多個具體產品之間是相互耦合的,也就是說這裡的抽象工廠提供的產品之間是存在某種聯繫的。
有人做如下的比較:
工廠方法模式:一個抽象產品類,可以派生出多個具體產品類。
一個抽象工廠類,可以派生出多個具體工廠類。
每個具體工廠類只能創建一個具體產品類的實例。
抽象工廠模式:多個抽象產品類,每個抽象產品類可以派生出多個具體產品類。
一個抽象工廠類,可以派生出多個具體工廠類。
每個具體工廠類可以創建多個具體產品類的實例。
區別:工廠方法模式只有一個抽象產品類,而抽象工廠模式有多個。
工廠方法模式的具體工廠類只能創建一個具體產品類的實例,而抽象工廠模式可以創建多個。
下面是一個形象的比喻:
無論是簡單工廠模式、工廠模式還是抽象工廠模式,它們本質上都是將不變的部分提取出來,將可變的部分留作介面,以達到最大程度上的復用。拿一個生產水杯(cup)的工廠舉例:起初,不用工廠模式,我必須在生產水杯之前知道水杯的材料和形狀等水杯的所有特徵才能生產,這就是我們的new Cup();這個Cup必須是具體的。廠主發現同一形狀的被子,只是材料不同,如一個是玻璃(glass)的,一個是瓷(china)的,但是確要兩條生產線,顯然有資源浪費的嫌疑。現在廠主生產杯子時先不讓生產線知道我要產的是玻璃的還是瓷的,而是讓它在不知道具體材料的情況下先做它能做的,等到它把模具做好,只需要向其中填充玻璃原料或者瓷原料就可以造出同一形狀的具體杯子了。但是很可惜,java並不能new一個抽象的Cup,所以就有了簡單工廠模式。原來是Cup cup=new Cup;現在是SimpleCupFactory.createCup(String cupName),根據cup的名字生產Cup,而createCup返回的是一個實現了 Cup介面或抽象類的具體Cup。簡單抽象工廠模式有一個問題,就是當我現在想生產一個同樣形狀的鐵杯時,工廠里並沒有定義相應的處理流程,只能更改createCup方法,這就不合理了。我現在只是想生產鐵杯,你只要在最後的時候把玻璃原料換成鐵的不就行了嗎,幹嘛還要更改整條生產線呢?於是就有了工廠模式。原來生產線在生產模具的時候還要考慮是為玻璃杯生產的模具還是為鐵杯生產的模具,現在它不用管了。CupFactory.createCup()創建Cup.CupFactory是介面或抽象類。實現它的具體子類會創建符合Cup介面的具體Cup。那麼現在廠主想要生產水壺(kettle),用工廠模式就不得不再造一條水壺生產線,能不能在水杯生產線同時生產水壺呢?這就是抽象工廠模式。
推薦閱讀:
TAG:自學編程 |