附加概念:
产品等级结构:不同品牌的同一类产品,如Haier电视机,TCL电视机都是电视机,因此属于同一个产品等级结构。
产品族:属于同一个品牌的所有产品,如Haier电视机,Haier冰箱等。
模式动机:工厂方法模式一般针对的是一个产品等级结构(如仅生产电视机),而抽象工厂模式针对的是多个产品等级结构(如不仅生产电视机,还生产空调)。
模式定义:一个具体工厂可以创建一个产品族的所有产品,又称为Kit模式。
模式结构图:
模式代码:
bt_抽象工厂模式.h:
1 #ifndef AFP_H 2 #define AFP_H 3 #include <iostream> 4 5 /* 6 抽象产品接口 7 */ 8 class AbstractProductA 9 { 10 public: 11 virtual ~AbstractProductA(){ }; 12 }; 13 14 class AbstractProductB 15 { 16 public: 17 virtual ~AbstractProductB(){ }; 18 }; 19 20 /* 21 具体产品类A 22 */ 23 class ConcreteProductA1 : public AbstractProductA 24 { 25 public: 26 ConcreteProductA1(); 27 }; 28 ConcreteProductA1::ConcreteProductA1() 29 { 30 std::cout << "创建产品族1中的A" << std::endl; 31 } 32 class ConcreteProductA2 : public AbstractProductA 33 { 34 public: 35 ConcreteProductA2(); 36 }; 37 ConcreteProductA2::ConcreteProductA2() 38 { 39 std::cout << "创建产品族2中的A" << std::endl; 40 } 41 42 /* 43 具体产品类B 44 */ 45 class ConcreteProductB1 : public AbstractProductB 46 { 47 public: 48 ConcreteProductB1(); 49 }; 50 ConcreteProductB1::ConcreteProductB1() 51 { 52 std::cout << "创建产品族1中的B" << std::endl; 53 } 54 class ConcreteProductB2 : public AbstractProductB 55 { 56 public: 57 ConcreteProductB2(); 58 }; 59 ConcreteProductB2::ConcreteProductB2() 60 { 61 std::cout << "创建产品族2中的B" << std::endl; 62 } 63 64 65 /* 66 抽象工厂接口 67 */ 68 69 class AbstractFactory 70 { 71 public: 72 virtual ~AbstractFactory(){ }; 73 virtual AbstractProductA* createProductA() = 0; 74 virtual AbstractProductB* createProductB() = 0; 75 }; 76 77 /* 78 具体工厂ConcreteFactory1负责生产 "产品族1" 79 */ 80 81 class ConcreteFactory1 : public AbstractFactory 82 { 83 public: 84 virtual AbstractProductA* createProductA(); 85 virtual AbstractProductB* createProductB(); 86 }; 87 AbstractProductA* ConcreteFactory1::createProductA() 88 { 89 return new ConcreteProductA1; 90 } 91 AbstractProductB* ConcreteFactory1::createProductB() 92 { 93 return new ConcreteProductB1; 94 } 95 96 /* 97 具体工厂ConcreteFactory2负责生产 "产品族2" 98 */ 99 100 class ConcreteFactory2 : public AbstractFactory 101 { 102 public: 103 virtual AbstractProductA* createProductA(); 104 virtual AbstractProductB* createProductB(); 105 }; 106 AbstractProductA* ConcreteFactory2::createProductA() 107 { 108 return new ConcreteProductA2; 109 } 110 AbstractProductB* ConcreteFactory2::createProductB() 111 { 112 return new ConcreteProductB2; 113 } 114 #endif // AFP_H
bt_抽象工厂模式.cpp:
1 #include "bt_抽象工厂模式.h" 2 #include <iostream> 3 4 int main() 5 { 6 std::cout << "***** 抽象工厂模式测试 *****" << std::endl; 7 AbstractFactory* factory = NULL; 8 AbstractProductA* pa = NULL; 9 AbstractProductB* pb = NULL; 10 11 factory = new ConcreteFactory1; 12 pa = factory->createProductA(); 13 pb = factory->createProductB(); 14 15 std::cout << std::endl; 16 factory = new ConcreteFactory2; 17 pa = factory->createProductA(); 18 pb = factory->createProductB(); 19 20 delete pb; 21 delete pa; 22 delete factory; 23 24 return 0; 25 }
模式优缺点:
添加新的产品族(即一个新的品牌)比较容易,此时只需要定义新的工厂和产品类即可;但增加产品等级(即原有品牌的种类)比较麻烦,此时必须修改抽象工厂以添加新种类的生产接口,同时所有已有的产品族工厂也要修改,这就违背了“开闭原则”。该模式具体应用中一般适合对象的多种状态同时发生变化时,比如操作系统中的主题管理程序等。
比较:
抽象工厂模式针对的是多个产品等级,而工厂方法模式针对的是一个产品等级,抽象工厂模式经过退化后完全可以变为工厂方法模式,甚至是简单工厂模式。