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;
}
运行结果: