您的位置:首页 > 其它

抽象工厂模式

2017-08-29 21:27 127 查看
问题来源:假设有这样一款游戏,游戏有等级,分别为初级,中级,高级甚至有BT级。假设也是过关的游戏,每个关卡都有一些怪物(monster)守着,玩家要把这些怪物干掉才可以过关。作为开发者,我们就不得不创建怪物的类,然后初级怪物、中级怪物等都继承自怪物类(当然不同种类的则需要另创建类,但是模式相同)。在每个关卡,我们都要创建怪物的实例,例如初级就创建初级怪物(有很多种类)、中级创建中级怪物等。可以想象在这个系统中,将会有成千上万的怪物实例要创建,问题是还要保证创建的时候不会出错:初级不能创建BT级的怪物(玩家就郁闷了,玩家一郁闷,游戏也就挂挂了),反之也不可以。
AbstractFactory模式就是用来解决这类问题的:要创建一组相关或者相互依赖的对象。


定义:为创建一组相关或者以来的对象提供一个接口,而无需指定他们的具体类。

工厂模式的最重要的两个功能:

1. 定义创建对象的接口,封装了对象的创建。
2. 具体化类的工作延迟到子类中。



#include<iostream>
using namespace std;
class Product//创建一个抽象基类产品,所有产品都继承于它
{
public:
virtual void show() = 0;//产品的功能接口
};
class MDD :public Product//一个具体的产品
{
public:
void show()
{
cout << "this is MDD" << endl;
}
};
class KFC :public Product//一个具体的产品
{
public:
void show()
{
cout << "this is KFC" << endl;
}
};
class Factory//一个抽象工厂基类,所有的工厂都继承于它
{
public:
virtual Product* CreateProduct() = 0;//生产产品的接口
};
class MDDC :public Factory//某一类产品的具体工厂
{
public:
Product* CreateProduct()
{
return new MDD();
}
};
class KFCC :public Factory
{
public:
Product* CreateProduct()
{
return new KFC();
}
};
int main()
{
Factory *factory = new MDDC();
Product *product = factory->CreateProduct();
product->show();
delete factory;
delete product;
}


优点:

1. 便于交换产品系列,由于具体工厂类,例如IFactory *factory = new MDDC(),在一个应用中只需要在初始化的时候出现一次,这就使得改变一个应用的具体工厂变得非常容易,它只需要改变具体工厂就可以实现不同的产品配置。

2. 具体的创建实例过程与客户端分离,客户端通过他们的抽象接口提供操作实例,产品的具体类名也别具体工厂的实现分离,不会出现在客户端代码中,比如客户端中,客户认识的只有product,至于是MMD还是KFC,则不用关心。

缺点:

产品族的扩展将是一件十分费力的事情,假如产品族中需要增加一个新的产品,则几乎所有的工厂类都需要进行修改。所以使用抽象工厂模式时,对产品等级结构的划分是非常重要的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: