C++設計模式-AbstractFactory抽象工廠模式

AbstractFactoryios

要建立一組相關或者相互依賴的對象函數

做用:提供一個建立一系列相關或相互依賴對象的接口,而無需指定它們具體的類。spa

UML結構圖:code

抽象基類對象

1)AbstractProductA、AbstractProductB:分別表明兩種不一樣類型的產品,由具體的產品派生類對其實現blog

2)AbstractFactory:抽象工廠類,提供建立兩種產品的接口CreateProductA和CreateProductB,由派生的各個具體工廠類對其實現繼承

說明:接口

AbstractFactory模式關鍵就是將這一組對象的建立封裝到一個用於建立對象的類(ConcreteFactory)中產品

Abstract Factory模式和Factory最大的差異就是抽象工廠建立的是一系列相關的對象,其中建立的實現其實採用的就是Factory模式的方法,對於某個實現的有一個派生出來的抽象工廠,另外一個實現有另外一個派生出來的工廠io

抽象工廠須要特別注意的地方就是區分不一樣類型的產品和這些產品的不一樣實現.顯而易見的,若是有n種產品同時有m中不一樣的實現,那麼根據乘法原理可知有n*m個Factory模式的使用

AbstractFactory模式是爲建立一組(有多類)相關或依賴的對象提供建立接口,而Factory模式是爲一類對象提供建立接口或延遲對象的建立到子類中實現。而且能夠看到,AbstractFactory模式一般都是使用Factory模式實現(ConcreteFactory1)。

代碼以下

Product.h

 1 #ifndef _PRODUCT_H_
 2 #define _PRODUCT_H_
 3 
 4 //抽象基類AbstractProductA,表明A類產品的抽象
 5 class AbstractProductA
 6 {
 7 public:
 8     virtual ~AbstractProductA()=0;
 9     virtual void operation()=0;
10 protected:
11     AbstractProductA();//屏蔽構造函數
12 };
13 
14 //派生類ProductA1,繼承自AbstractProductA,A類產品的一種實現
15 class ProductA1 : public AbstractProductA
16 {
17 public:
18     ProductA1();
19     virtual void operation();
20     virtual ~ProductA1();
21 };
22 
23 //派生類ProductA2,繼承自AbstractProductA,A類產品的另外一種實現
24 class ProductA2:public AbstractProductA
25 {
26 public:
27     ProductA2();
28     virtual void operation();
29     virtual ~ProductA2();
30 };
31 
32 //抽象基類AbstractProductB,表明B類產品的抽象
33 class AbstractProductB
34 {
35 public:
36     virtual ~AbstractProductB()=0;
37     virtual void operation()=0;
38 protected:
39     AbstractProductB();//屏蔽構造函數
40 };
41 
42 //派生類ProductB1,繼承自AbstractProductB,B類產品的一種實現
43 class ProductB1:public AbstractProductB
44 {
45 public:
46     ProductB1();
47     virtual void operation();
48     virtual ~ProductB1();
49 };
50 
51 //派生類ProductB2,繼承自AbstractProductB,B類產品的另外一種實現
52 class ProductB2:public AbstractProductB
53 {
54 public:
55     ProductB2();
56     virtual void operation();
57     virtual ~ProductB2();
58 };
59 
60 
61 #endif

Factory.h

 1 #ifndef _FACTORY_H_
 2 #define _FACTORY_H_
 3 
 4 //AbstractFactory,工廠抽象基類,定義生產A類與B類產品的接口
 5 class AbstractProductA;
 6 class AbstractProductB;
 7 class AbstractFactory
 8 {
 9 public:
10     virtual ~AbstractFactory()=0;
11     virtual AbstractProductA* CreateProductA()=0;
12     virtual AbstractProductB* CreateProductB()=0;
13 protected:
14     AbstractFactory();
15 };
16 
17 //ConcreteFactory1,派生類,繼承自AbstractFactory
18 //實現繼承的接口,生產產品A和B的一種實現
19 class ConcreteFactory1:public AbstractFactory
20 {
21 public:
22     ConcreteFactory1();
23     ~ConcreteFactory1();
24     virtual AbstractProductA* CreateProductA();
25     virtual AbstractProductB* CreateProductB();
26 };
27 
28 //ConcreteFactory2,派生類,繼承自AbstractFactory
29 //實現繼承的接口,生產產品A和B的另外一種實現
30 class ConcreteFactory2:public AbstractFactory
31 {
32 public:
33     ConcreteFactory2();
34     ~ConcreteFactory2();
35     virtual AbstractProductA* CreateProductA();
36     virtual AbstractProductB* CreateProductB();
37 };
38 
39 #endif

Product.cpp

 1 #include "Product.h"
 2 #include <iostream>
 3 
 4 using namespace std;
 5 
 6 //AbstractProductA
 7 AbstractProductA::AbstractProductA()
 8 {
 9     cout << "AbstractProductA..." << endl;
10 }
11 
12 AbstractProductA::~AbstractProductA()
13 {
14     cout << "~AbstractProductA..." << endl;
15 }
16 
17 //ProductA1
18 ProductA1::ProductA1()
19 {
20     cout << "ProductA1..." << endl;
21 }
22 
23 ProductA1::~ProductA1()
24 {
25     cout << "~ProductA1..." << endl;
26 }
27 
28 void ProductA1::operation()
29 {}
30 
31 //ProductA2
32 ProductA2::ProductA2()
33 {
34     cout << "ProductA2..." << endl;
35 }
36 
37 ProductA2::~ProductA2()
38 {
39     cout << "~ProductA2..." << endl;
40 }
41 
42 void ProductA2::operation()
43 {}
44 
45 //AbstractProductB
46 AbstractProductB::AbstractProductB()
47 {
48     cout << "AbstractProductB..." << endl;
49 }
50 
51 AbstractProductB::~AbstractProductB()
52 {
53     cout << "~AbstractProductB..." << endl;
54 }
55 
56 //ProductB1
57 ProductB1::ProductB1()
58 {
59     cout << "ProductB1..." << endl;
60 }
61 
62 ProductB1::~ProductB1()
63 {
64     cout << "~ProductB1..." << endl;
65 }
66 
67 void ProductB1::operation()
68 {}
69 
70 //ProductB2
71 ProductB2::ProductB2()
72 {
73     cout << "ProductB2..." << endl;
74 }
75 
76 ProductB2::~ProductB2()
77 {
78     cout << "~ProductB2..." << endl;
79 }
80 
81 void ProductB2::operation()
82 {}

Factory.cpp

 1 #include "Factory.h"
 2 #include "Product.h"
 3 #include <iostream>
 4 
 5 using namespace std;
 6 
 7 AbstractFactory::AbstractFactory()
 8 {
 9     cout << "AbstractFactory..." << endl;
10 }
11 
12 AbstractFactory::~AbstractFactory()
13 {
14     cout << "~AbstractFactory..." << endl;
15 }
16 
17 ConcreteFactory1::ConcreteFactory1()
18 {
19     cout << "ConcreteFactory1..." << endl;
20 }
21 
22 ConcreteFactory1::~ConcreteFactory1()
23 {
24     cout << "~ConcreteFactory1..." << endl;
25 }
26 
27 AbstractProductA* ConcreteFactory1::CreateProductA()
28 {
29     return new ProductA1();
30 }
31 
32 AbstractProductB* ConcreteFactory1::CreateProductB()
33 {
34     return new ProductB1();
35 }
36 
37 ConcreteFactory2::ConcreteFactory2()
38 {
39     cout << "ConcreteFactory2..." << endl;
40 }
41 
42 ConcreteFactory2::~ConcreteFactory2()
43 {
44     cout << "~ConcreteFactory2..." << endl;
45 }
46 
47 AbstractProductA* ConcreteFactory2::CreateProductA()
48 {
49     return new ProductA2();
50 }
51 
52 AbstractProductB* ConcreteFactory2::CreateProductB()
53 {
54     return new ProductB2();
55 }

main.cpp

 1 #include <iostream>
 2 #include "Factory.h"
 3 #include "Product.h"
 4 
 5 using namespace std;
 6 
 7 int main()
 8 {
 9     AbstractFactory* fa1 = new ConcreteFactory1();
10     AbstractProductA* a1 = fa1->CreateProductA();
11     AbstractProductB* b1 = fa1->CreateProductB();
12 
13     cout << endl;
14     AbstractFactory* fa2 = new ConcreteFactory2();
15     AbstractProductA* a2 = fa2->CreateProductA();
16     AbstractProductB* b2 = fa2->CreateProductB();
17 
18     cout << endl;
19     delete fa1;
20     delete a1;
21     delete b1;
22 
23     cout << endl;
24     delete fa2;
25     delete a2;
26     delete b2;
27 
28     return 0;
29 }
相關文章
相關標籤/搜索