抽象工厂模式

问题来源:假设有这样一款游戏,游戏有等级,分别为初级,中级,高级甚至有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,则不用关心。
缺点:
产品族的扩展将是一件十分费力的事情,假如产品族中需要增加一个新的产品,则几乎所有的工厂类都需要进行修改。所以使用抽象工厂模式时,对产品等级结构的划分是非常重要的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值