定義:抽象工廠模式(Abstract Factory),提供一個創建一系列相關或相互依賴對象的接口,而無需要指定它們具體的類。
類型:創建型模式。
類圖:

參與角色:
1. FeaturePhone、SmartPhone,分別是功能手機和智能手機的兩個抽象類,分別抽象出來了功能機的制造流程,智能機的制造流程。
2. NokiaFeaturePhone、SamsungFeaturePhone,分別實現了功能機的制造流程。
3. NokiaSmartPhone、SamsungSamrtPhone,分別實現了智能機的生產制造流程。
4. Factory,抽象工廠,即手機生產廠所必須具備的基本要求都抽象出來了。
5. NokiaFactory,根據Nokia手機生產的要求,在已經建設好的抽象工廠上完成了Nokia功能機以及智能機生產的基本要求。
6. SamsungFactory,根據Samsung手機生產的要求,在已經建設好的抽象工廠上完成了Samsung功能機和智能機生產的工廠基本要求。
概述:
?????? 隨著科技的發展,手機越來越強大,智能手機(Smart Phone)越來越普及,而傳統的功能手機(Feature Phone)銷量在進一步下滑。各家手機生產商都在裁剪功能手機的生產線,但是手機生產線能夠減少,廠房卻不能減少。為了節約成本,代工廠決定將Nokia的手機放在一個工廠里生產,Samsung手機放在另外一個工廠里生產。這樣就不用再新建工廠了,工廠的利用率得到提升。
????? 抽象工廠模式就是為了解決這一問題而產生的。當不同的產品越來越多時,如果給每個產品新建一個工廠,會顯得很浪費,并且如果工廠過多,管理工廠本身也會成為一個問題。這個時候,一系列比較有共性的產品共用一個工廠是個比較好的選擇。將已經改造好的Nokia功能手機以及智能手機生產線,直接對接到已經根據要求改造過的Nokia手機生產廠就可以直接生產Nokia功能機以及智能機了。
代碼:
[]( "復制代碼")
~~~
1 #include <iostream>
2 #include <afxcom_.h>
3 using namespace std;
4
5
6 class CFeaturePhone
7 {
8 public:
9 virtual void ProducePhone() = 0;
10 };
11
12 class CSmartPhone
13 {
14 public:
15 virtual void ProducePhone() = 0;
16 };
17
18 class CNokiaFeaturePhone : public CFeaturePhone
19 {
20 public:
21 virtual void ProducePhone()
22 {
23 cout<<"Produce Nokia feature Phone."<<endl;
24 }
25 };
26
27 class CsamsungFeaturePhone : public CFeaturePhone
28 {
29 public:
30 virtual void ProducePhone()
31 {
32 cout<<"Produce Samsung feature phone."<<endl;
33 }
34 };
35
36 class CNokiaSmartPhone : public CSmartPhone
37 {
38 public:
39 virtual void ProducePhone()
40 {
41 cout<<"Produce Nokia smart phone."<<endl;
42 }
43 };
44
45 class CSamsungSmartPhone : public CSmartPhone
46 {
47 public:
48 virtual void ProducePhone()
49 {
50 cout<<"Produce Samsung smart phone."<<endl;
51 }
52 };
53
54 class CFactory
55 {
56 public:
57 virtual CFeaturePhone* CreateFeaturePhone() = 0;
58 virtual CSmartPhone* CreateSmartPhone() = 0;
59 };
60
61 class CNokiaPhoneFactory : public CFactory
62 {
63 public:
64 virtual CFeaturePhone* CreateFeaturePhone()
65 {
66 CFeaturePhone* pPhone = new CNokiaFeaturePhone();
67
68 return pPhone;
69 }
70
71 virtual CSmartPhone* CreateSmartPhone()
72 {
73 CSmartPhone* pPhone = new CNokiaSmartPhone();
74
75 return pPhone;
76 }
77 };
78
79 class CSamsungPhoneFactory : public CFactory
80 {
81 public:
82 virtual CFeaturePhone* CreateFeaturePhone()
83 {
84 CFeaturePhone* pPhone = new CsamsungFeaturePhone();
85
86 return pPhone;
87 }
88
89 virtual CSmartPhone* CreateSmartPhone()
90 {
91 CSmartPhone* pPhone = new CSamsungSmartPhone();
92
93 return pPhone;
94 }
95 };
96
97 int _tmain(int argc, _TCHAR* argv[])
98 {
99 // Nokia phone factory
100 CFactory* pNokiaFactory = new CNokiaPhoneFactory();
101 CFeaturePhone* pNokiaFeaturePhone = pNokiaFactory->CreateFeaturePhone();
102 pNokiaFeaturePhone->ProducePhone();
103 CSmartPhone* pNokiaSmartPhone = pNokiaFactory->CreateSmartPhone();
104 pNokiaSmartPhone->ProducePhone();
105
106 delete pNokiaFeaturePhone;
107 pNokiaFeaturePhone = NULL;
108 delete pNokiaSmartPhone;
109 pNokiaSmartPhone = NULL;
110 delete pNokiaFactory;
111 pNokiaFactory = NULL;
112
113 // Samsung phone factory
114 CFactory* pSamsungFactory = new CSamsungPhoneFactory();
115 CFeaturePhone* pSamsungFeaturePhone = pSamsungFactory->CreateFeaturePhone();
116 pSamsungFeaturePhone->ProducePhone();
117 CSmartPhone* pSamsungSmartPhone = pSamsungFactory->CreateSmartPhone();
118 pSamsungSmartPhone->ProducePhone();
119
120 delete pSamsungFeaturePhone;
121 pSamsungFeaturePhone = NULL;
122 delete pSamsungSmartPhone;
123 pSamsungSmartPhone = NULL;
124 delete pSamsungFactory;
125 pSamsungFactory = NULL;
126
127 return 0;
128 }
~~~
[]( "復制代碼")
適用場合:
適用產品簇比較多,并且產品系列比較多的類型。例如某電子公司,光鎳電子就有十幾個系列,因為每一條鎳電池生產線較小,如果每一款鎳電池建一個工廠,不現實,所有鎳電池生產線共用一個工廠會比較好。另外,公司不僅有鎳電池系列,還有不同款式的學習機,電子辭典等許多電子產品。這樣的公司就比較適合使用抽象工廠模式。
優缺點:
1. 優點,同一系列或者相互關聯的產品,可以共用工廠,而不必新建工廠,工廠的效率利用率會比較高。
1. 缺點,如果同一系列或者相互關聯的產品里又增加了新的產品,則共同的工廠需要修改來進行生產新產品,這可能會影響到原有的產品的正常生產。
參考資料:
1. 《設計模式——可復用面向對象軟件基礎》
1. 《Java與模式》
1. 《大話設計模式》
- 前言
- 設計模式六大原則
- 1——創建型模式之簡單工廠模式
- 2——創建型模式之工廠方法模式
- 3——創建型模式之抽象工廠模式
- 4——創建型模式之單例模式
- 5——創建型模式之建造者模式
- 6——創建型模式之原型模式
- 7——結構型模式之適配器模式
- 8——結構型模式之橋接模式
- 9——結構型模式之組合模式
- 10——結構型模式之裝飾者模式
- 11——結構型模式之外觀模式
- 12——結構型模式之享元模式
- 13——結構型模式之代理模式
- 14——行為型模式之職責鏈模式
- 15——行為型模式之命令模式
- 16——行為型模式之解釋器模式
- 17——行為型模式之迭代器模式
- 18——行為型模式之中介者模式
- 19——行為型模式之備忘錄模式
- 20——行為型模式之觀察者模式
- 21——行為型模式之狀態模式
- 22——行為型模式之策略模式
- 23——行為型模式之模板方法模型
- 24——行為型模式之訪問者模式
- 設計模式總結