AbstractFactory
要創建一組相關或者相互依賴的對象
作用:提供一個創建一系列相關或相互依賴對象的接口,而無需指定它們具體的類。
UML結構圖:
抽象基類:
1)AbstractProductA、AbstractProductB:分別代表兩種不同類型的產品,由具體的產品派生類對其實現
2)AbstractFactory:抽象工廠類,提供創建兩種產品的接口CreateProductA和CreateProductB,由派生的各個具體工廠類對其實現
說明:
AbstractFactory模式關鍵就是將這一組對象的創建封裝到一個用於創建對象的類(ConcreteFactory)中
Abstract Factory模式和Factory最大的差別就是抽象工廠創建的是一系列相關的對象,其中創建的實現其實采用的就是Factory模式的方法,對於某個實現的有一個派生出來的抽象工廠,另一個實現有另一個派生出來的工廠
抽象工廠需要特別注意的地方就是區分不同類型的產品和這些產品的不同實現.顯而易見的,如果有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 }