软件设计精要之——抽象工厂模式(Abstract Factory)

1、问题背景

假设我们要开发一款游戏,当然为了吸引更多的人玩,游戏难度不能太大(让大家都没有信心了,估计游戏也就没有前途了),但是也不能太简单(没有挑战性也不符合玩家的心理)。于是我们就可以采用这样一种处理策略:为游戏设立等级,初级、中级、高级甚至有BT级。假设也是过关的游戏,每个关卡都有一些怪物(monster)守着,玩家要把这些怪物干掉才可以过关。作为开发者,我们就不得不创建怪物的类,然后初级怪物、中级怪物等都继承自怪物类(当然不同种类的则需要另创建类,但是模式相同)。在每个关卡,我们都要创建怪物的实例,例如初级就创建初级怪物(有很多种类)、中级创建中级怪物等。可以想象在这个系统中,将会有成千上万的怪物实例要创建,问题是还要保证创建的时候不会出错:初级不能创建BT级的怪物(玩家就郁闷了,玩家一郁闷,游戏也就挂挂了),反之也不可以。

2、模式示意图

抽象工厂模式示意图

AbstractFactory模式关键就是将一组对象的创建封装到一个用于创建对象的类ConcreteFactory中,维护这样一个创建类总比维护N多相关对象的创建过程要简单的多。

3、代码实现

代码实现如下:

//////////////////////////////////////////////////////////////////////////

//Factory.h

//////////////////////////////////////////////////////////////////////////

#ifndef _FACTORY_H_

#define _FACTORY_H_

#include “Product.h”

class AbstractFactory

{

public:

virtual ~AbstractFactory();

public:

virtual AbstractProductA* fnCreateProductA() = 0;

virtual AbstractProductB* fnCreateProductB() = 0;

protected:

AbstractFactory();

private:

};

class ConcreteFactory1:public AbstractFactory

{

public:

ConcreteFactory1();

~ConcreteFactory1();

public:

AbstractProductA* fnCreateProductA();

AbstractProductB* fnCreateProductB();

protected:

private:

};

class ConcreteFactory2:public AbstractFactory

{

public:

ConcreteFactory2();

~ConcreteFactory2();

public:

AbstractProductA* fnCreateProductA();

AbstractProductB* fnCreateProductB();

protected:

private:

};

#endif //#ifndef _FACTORY_H_

//////////////////////////////////////////////////////////////////////////

//Factory.cpp

//////////////////////////////////////////////////////////////////////////

#include “Factory.h”

#include “Product.h”

#include <iostream>

using namespace std;

AbstractFactory::AbstractFactory()

{

}

AbstractFactory::~AbstractFactory()

{

}

ConcreteFactory1::ConcreteFactory1()

{

}

ConcreteFactory1::~ConcreteFactory1()

{

}

AbstractProductA* ConcreteFactory1::fnCreateProductA()

{

return new ConcreteProductA1();

}

AbstractProductB* ConcreteFactory1::fnCreateProductB()

{

return new ConcreteProductB1();

}

ConcreteFactory2::ConcreteFactory2()

{

}

ConcreteFactory2::~ConcreteFactory2()

{

}

AbstractProductA* ConcreteFactory2::fnCreateProductA()

{

return new ConcreteProductA2();

}

AbstractProductB* ConcreteFactory2::fnCreateProductB()

{

return new ConcreteProductB2();

}

//////////////////////////////////////////////////////////////////////////

//Product.h

//////////////////////////////////////////////////////////////////////////

#ifndef _PRODUCT_H_

#define _PRODUCT_H_

class AbstractProductA

{

public:

virtual ~AbstractProductA();

protected:

AbstractProductA();

private:

};

class AbstractProductB

{

public:

virtual ~AbstractProductB();

protected:

AbstractProductB();

private:

};

class ConcreteProductA1:public AbstractProductA

{

public:

ConcreteProductA1();

~ConcreteProductA1();

protected:

private:

};

class ConcreteProductA2:public AbstractProductA

{

public:

ConcreteProductA2();

~ConcreteProductA2();

protected:

private:

};

class ConcreteProductB1:public AbstractProductB

{

public:

ConcreteProductB1();

~ConcreteProductB1();

protected:

private:

};

class ConcreteProductB2:public AbstractProductB

{

public:

ConcreteProductB2();

~ConcreteProductB2();

protected:

private:

};

#endif //#ifndef _PRODUCT_H_

//////////////////////////////////////////////////////////////////////////

//Product.cpp

//////////////////////////////////////////////////////////////////////////

#include “Product.h”

#include <iostream>

using namespace std;

AbstractProductA::AbstractProductA()

{

}

AbstractProductA::~AbstractProductA()

{

}

AbstractProductB::AbstractProductB()

{

}

AbstractProductB::~AbstractProductB()

{

}

ConcreteProductA1::ConcreteProductA1()

{

cout<<“ConcreteProductA1…”<<endl;

}

ConcreteProductA1::~ConcreteProductA1()

{

}

ConcreteProductA2::ConcreteProductA2()

{

cout<<“ConcreteProductA2…”<<endl;

}

ConcreteProductA2::~ConcreteProductA2()

{

}

ConcreteProductB1::ConcreteProductB1()

{

cout<<“ConcreteProductB1…”<<endl;

}

ConcreteProductB1::~ConcreteProductB1()

{

}

ConcreteProductB2::ConcreteProductB2()

{

cout<<“ConcreteProductB2…”<<endl;

}

ConcreteProductB2::~ConcreteProductB2()

{

}

//////////////////////////////////////////////////////////////////////////

//main.cpp

//////////////////////////////////////////////////////////////////////////

#include “Factory.h”

#include <iostream>

using namespace std;

void main()

{

AbstractFactory* pFactory1 = new ConcreteFactory1();

pFactory1->fnCreateProductA();

pFactory1->fnCreateProductB();

AbstractFactory* pFactory2 = new ConcreteFactory2();

pFactory2->fnCreateProductA();

pFactory2->fnCreateProductB();

}

运行结果如下:

4、总结与讨论

AbstractFactory模式是产生多个类型的工厂,而且每个类型的工厂所产生的一序列产品类型不一样(不同的基类);而Factory模式是产生一个类型的工厂(提供创建接口且延迟对象的创建到子类中实现),产生的产品类型一样(相同的基类)。AbstractFactory模式通常都是使用Factory模式实现。

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2019年7月17日
下一篇 2019年7月17日

相关推荐