C++ 设计模式之抽象工厂模式

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;
}

运行结果:





猜你喜欢

转载自blog.csdn.net/moon5555/article/details/79943054