1、问题
假设我们要开发一款游戏, 当然为了吸引更多的人玩, 游戏难度不能太大(让大家都没有信心了, 估计游戏也就没有前途了),但是也不能太简单(没有挑战性也不符合玩家的心理)。于是我们就可以采用这样一种处理策略: 为游戏设立等级,初级、中级、高级甚至有BT级。假设也是过关的游戏, 每个关卡都有一些怪物(monster) 守着, 玩家要把这些怪物干掉才可以过关。 作为开发者, 我们就不得不创建怪物的类, 然后初级怪物、 中级怪物等都继承自怪物类(当然不同种类的则需要另创建类,但是模式相同)。在每个关卡, 我们都要创建怪物的实例,例如初级就创建初级怪物(有很多种类)、中级创建中级怪物等。可以想象在这个系统中, 将会有成千上万的怪物实例要创建, 问题是还要保证创建的时候不会出错:初级不能创建BT 级的怪物(玩家就郁闷了,玩家一郁闷,游戏也就挂挂了),反之也不可以。
AbstractFactory 模式就是用来解决这类问题的:要创建一组相关或者相互依赖的对象。
2、模式选择
抽象工厂模式结构图
3、代码实现
#include <iostream> using namespace std; class ProductA { public: ProductA(string name) :mname(name) {} virtual ~ProductA() {} virtual void operation() = 0; protected: string mname; }; class ProductA1 :public ProductA { public: ProductA1(string name) :ProductA(name) {} ~ProductA1() {} void operation() { cout << "A1" << endl; } }; class ProductA2 :public ProductA { public: ProductA2(string name) :ProductA(name) {} ~ProductA2() {} void operation() { cout << "A2" << endl; } }; class ProductB { public: ProductB(string name) :mname(name) {} virtual ~ProductB() {} virtual void operation() = 0; protected: string mname; }; class ProductB1 :public ProductB { public: ProductB1(string name) :ProductB(name) {} ~ProductB1() {} void operation() { cout << "B1" << endl; } }; class ProductB2 :public ProductB { public: ProductB2(string name) :ProductB(name) {} ~ProductB2() {} void operation() { cout << "B2" << endl; } }; class AbstractFactory { public: virtual ProductA* createProductA() = 0; virtual ProductB* createProductB() = 0; virtual ~AbstractFactory(){}; }; class Factory1 :public AbstractFactory { public: virtual ProductA* createProductA() { return new ProductA1("A1"); } virtual ProductB* createProductB() { return new ProductB1("B1"); } }; class Factory2 :public AbstractFactory { public: virtual ProductA* createProductA() { return new ProductA2("A2"); } virtual ProductB* createProductB() { return new ProductB2("B2"); } }; int main() { AbstractFactory* ap1 = new Factory1(); ProductA* pa1 = ap1->createProductA(); pa1->operation(); delete pa1; AbstractFactory* ap2 = new Factory2(); ProductA* pa2 = ap2->createProductA(); pa2->operation(); return 0; }
运行结果: