抽象工厂(Abstract Factory)模式看起来和前面的工厂方法很相似,只是它使用若干工厂方法(Factory Method)模式。
每个工厂方法模式创建一个不同类型的对象。用户界面当创建一个工厂对象时,要决定将如何使用那个工厂创建的所有对象。
实现各种图形(GUI)的可移植性:创建一个合适于正在使用的GUI的工厂对象,然后它将根据对它发出的对一个菜单、按钮或者滚动条等的请求自动创建合适
该GUI的项目版本。这样就能够在一个地方隔离从一个GUI转变到另一个GUI的作用。
//举个例子。假设要创建一个通用的游戏环境,并且希望他能支持不同类型的游戏。
//a gaming environment
#include <iostream>
using namespace std;
class Obstacle
{
public:
virtual void action() = 0;
};
class Player
{
public:
virtual void interactWith(Obstacle*)=0;
};
class Kitty:public Player
{
virtual void interactWith(Obstacle* ob)
{
cout<< "Kitty has encountered a " ;
ob->action();
}
};
class KungFuGuy:public Player
{
virtual void interactWith(Obstacle* ob)
{
cout<< "KungFuGuy now battles agsinst a " ;
ob->action();
}
};
class Puzzle:public Obstacle
{
public:
void action(){cout << "Puzzle"<<endl;}
};
class NastyWeapon:public Obstacle
{
public:
void action(){cout << "NastyWeapon"<<endl;}
};
//the abstract factory:
class GameElementFactory
{
public:
virtual Player* makePlayer()=0;
virtual Obstacle* makeObstacle()=0;
};
//concrete factories:
class KittiesAndPuzzles:public GameElementFactory
{
public:
virtual Player* makePlayer(){return new Kitty;}
virtual Obstacle* makeObstacle(){return new Puzzle;}
};
class KillAndDismember:public GameElementFactory
{
public:
virtual Player* makePlayer(){return new KungFuGuy;}
virtual Obstacle* makeObstacle(){return new NastyWeapon;}
};
class GameEnvironment
{
GameElementFactory* gef;
Player* p;
Obstacle* ob;
public:
GameEnvironment(GameElementFactory* factory):gef(factory),p(factory->makePlayer()),ob(factory->makeObstacle()){}
void play() {p->interactWith(ob);}
~GameEnvironment()
{
delete p;
delete ob;
delete gef;
}
};
int main()
{
GameEnvironment g1(new KittiesAndPuzzles) ,g2(new KillAndDismember);
g1.play();
g2.play();
}
在此环境中,Player 对象与Obstacle对象交互,但是Player 和Obstacle 类型依赖于具体的游戏。
可以选择特定GameElementFactory 来决定游戏的类型,然后GameEnvironment 控制游戏的设置和进行。
本例中,游戏的设置和进行很简单,但是那些动作(初始条件(initial condition)和状态变化(state change))在很大程度上决定了游戏的结果