在抽象工廠模式中,我引用從網上看來的一篇例子來說明。
隨著時間的推移,走過的地方越來越多,你天南海北的朋友也越來越多。你發現菜原來還分了許多菜系,魯菜、粵菜、湘菜等等, 你招待
不同的朋友要用不同的菜系,這下難辦了,你的廚師都是魯菜風味,怎麼辦,廣東的朋友來了吃不慣。現在我們再回到簡單工廠模式,我們把
紅燒肉再向下繼承,生成魯菜紅燒肉、粵菜紅燒肉、湘菜紅燒肉;清蒸魚向下繼承為魯菜清蒸魚、粵菜清蒸魚、湘菜清蒸魚,其它也以此類
推。我們也修改一下這個類,不讓其返回食物基類,而是返回紅燒肉、清蒸魚這一層次,並把這些方法抽象化,作為菜系工廠基類,然後再從
此基類繼承出,魯菜工廠、粵菜工廠、湘菜工廠等等,再由這些具體工廠實現建立具體菜的工作,哈哈你如果招待廣東朋友就用粵菜工廠,返
回的就是一桌粵菜菜系的紅燒肉、清蒸魚了,你的廣東朋友一定會吃的非常合乎胃口了。噢,非常好,你已經實現了抽象工廠模式了。結構模
型圖也變成了的樣子了。
現在可以看到,想新來做乙個菜系,只需新聘請乙個廚師就可以了,多麼完美,但是如果你想新增加乙個菜就變得非常困難了。
實現**:
//產品基類
#include
class foodproduct
;//紅燒魚類
class braisingfish :public foodproduct
;//清蒸魚類
class steamedfish :public foodproduct
;//川式清蒸魚
class chuanbraisingfish :public braisingfish
;//魯式清蒸魚
class lubraisingfish :public braisingfish
;//川(魯)式紅燒魚類的寫法與清蒸魚類相同
//下面實現烹飪工廠
//烹飪總工廠
class cookfactory
;//魯菜工廠
class lucookfactory :public cookfactory
;//魯菜工廠的實現
braisingfish *lucookfactory::cookbraisingfish()
//川菜工廠
class chuancookfactory :public cookfactory
;//川菜工廠的實現
braisingfish *chuancookfactory::cookbraisingfish()
至此,抽象工廠模式完成。
現在可以和工廠模式對比一下,抽象工廠返回的介面不再是產品a和產品b的共同基類product了,而是產品a、產品b基類(在工廠模式
中它們為具體實現類,這裡變成了基類)了。此時工廠的抽象和簡單工廠中的工廠方法也很類似,就是這些特徵區使其別於工廠模式而變成抽
象工廠模式了,因此抽象工廠解決的是建立一系列有共同風格的產品(魯菜還是粵菜),而工廠方法模式解決的建立有共同特徵的一系列產品
(紅燒肉、清蒸魚它們都是食物)。當然簡單工廠的缺陷在抽象工廠中又再次出現了,我要新增加乙個產品,工廠抽象介面就要改變了。因此
抽象工廠並不比工廠模式完美,只不過是各自的適用領域不同而已。其實,這裡如果把抽象工廠模式的介面返回產品a和產品b的共同基類
(工廠模式返回的引數),你會發現,奇怪這個模式怎麼這麼眼熟,它不是恰恰退化成工廠模式了。
類模式與物件模式的區別討論:先看定義類「模式使用繼承關係,把物件的建立延遲的子類,物件模式把物件的建立延遲到另乙個物件
中」。 分析:首先它們建立物件都不是在基類中完成,都是在子類中實現,因此都符合類模式的概念;但是工廠模式的建立產品物件是在編
譯期決定的,要呼叫某個工廠固定的,而抽象工廠模式對產品的建立是在執行時動態決定的,只有到執行時才確定要呼叫那個工廠,呼叫工廠
隨執行環境而改變。
適用性:
設計模式C 描述 抽象工廠模式
閱讀此文應先閱讀簡單工廠模式與工廠方法模式抽象工廠模式是物件的建立模式,它是工廠方法模式的進一步推廣。假設乙個子系統需要一些產品物件,而這些產品又屬於乙個以上的產品等級結構。那麼為了將消費這些產品物件的責任和建立這些產品物件的責任分開,可以引進抽象工廠模式。這樣的話,消費產品的客戶不需要直接參與產品...
設計模式C 描述 抽象工廠模式
設計模式c 描述 抽象工廠模式 閱讀此文應先閱讀簡單工廠模式與工廠方法模式 抽象工廠模式是物件的建立模式,它是工廠方法模式的進一步推廣。假設乙個子系統需要一些產品物件,而這些產品又屬於乙個以上的產品等級結構。那麼為了將消費這些產品物件的責任和建立這些產品物件的責任分開,可以引進抽象工廠模式。這樣的話...
設計模式C 描述 抽象工廠模式
設計模式c 描述 抽象工廠模式 閱讀此文應先閱讀簡單工廠模式與工廠方法模式 抽象工廠模式是物件的建立模式,它是工廠方法模式的進一步推廣。假設乙個子系統需要一些產品物件,而這些產品又屬於乙個以上的產品等級結構。那麼為了將消費這些產品物件的責任和建立這些產品物件的責任分開,可以引進抽象工廠模式。這樣的話...