1. 意图
提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
2. 别名
Kit
3. 动机
假设我们要开发一款游戏,当然为了吸引更多的人玩,游戏难度不能太大 (让大家都没有信心了,估计游戏也就没有前途了),但是也不能太简单 (没有挑战性也不符合玩家的心理)。于是我们就可以采用这样一种处理策略:为游戏设立等级,初级、中级、高级甚至有BT 级。假设也是过关的游戏,每个关卡都有一些怪物 (monster)守着,玩家要把这些怪物干掉才可以过关。作为开发者,我们就不得不创建怪物的类,然后初级怪物、中级怪物等都继承自怪物类(当然不同种类的则需要另创建类,但是模式相同)。在每个关卡,我们都要创建怪物的实例,例如初级就创建初级怪物(有很多种类)、中级创建中级怪物等。可以想象在这个系统中,将会有成千上万的怪物实例要创建,问题是还要保证创建的时候不会出错:初级不能创建 BT 级的怪物(玩家就郁闷了,玩家一郁闷,游戏也就挂挂了),反之也不可以。
AbstractFactory 模式就是用来解决这类问题的:要创建一组相关或者相互依赖的对象。
②一个系统要由多个产品系列中的一个来配置时。
③当你要强调一系列相关的产品对象的设计以便进行联合使用时。
④当你提供一个产品类库,而只想显示它们的接口而不是实现时。
②Concreteactory(MotifWidgetFactory,PMWidgetFactory):实现创建具体产品对象的操作。
③AbstractProduct(Windows,ScrollBar):为一类产品对象声明一个接口。
④ConcreteProduct(MotifWindow,MotifScrollBar):定义一个将被相应的具体工厂创建的产品对象;实现AbstractProduct接口。
⑤Client:仅使用由AbstractFactory和AbstractProduct类声明的接口。
#include<iostream> class AbstractProductA{ public: virtual ~ AbstractProductA(){} protected: AbstractProductA(){} }; class AbstractProductB{ public: virtual ~ AbstractProductB(){} protected: AbstractProductB(){} }; class ProductA1:public AbstractProductA{ public: ProductA1(){std::cout<< "ProductA1..."<<std::endl;} }; class ProductA2:public AbstractProductA{ public: ProductA2(){std::cout<< "ProductA2..."<<std::endl;} }; class ProductB1:public AbstractProductB{ public: ProductB1(){std::cout<< "ProductB1..."<<std::endl;} }; class ProductB2:public AbstractProductB{ public: ProductB2(){std::cout<< "ProductB2..."<<std::endl;} }; class AbstractFactory{ public: virtual ~AbstractFactory(){} virtual AbstractProductA* CreateProductA()=0; virtual AbstractProductB* CreateProductB()=0; protected: AbstractFactory(){} }; class ConcreteFactory1:public AbstractFactory{ public: AbstractProductA* CreateProductA(){ return new ProductA1();} AbstractProductB* CreateProductB(){ return new ProductB1();} }; class ConcreteFactory2:public AbstractFactory{ public: AbstractProductA* CreateProductA(){ return new ProductA2();} AbstractProductB* CreateProductB(){ return new ProductB2();} }; int main(){ AbstractFactory * cf1 = new ConcreteFactory1(); cf1->CreateProductA(); cf1->CreateProductB(); AbstractFactory * cf2 = new ConcreteFactory2(); cf2->CreateProductA(); cf2->CreateProductB(); }