抽象工厂模式
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,则不用关心。
缺点:
产品族的扩展将是一件十分费力的事情,假如产品族中需要增加一个新的产品,则几乎所有的工厂类都需要进行修改。所以使用抽象工厂模式时,对产品等级结构的划分是非常重要的。
相关文章推荐
- Java设计模式之三(抽象工厂模式)
- 抽象工厂模式
- 抽象工厂模式-- 学习笔记
- 设计模式入门之抽象工厂模式
- Abstract Factory 抽象工厂模式
- 抽象工厂模式java实现
- java中的抽象工厂模式
- 抽象工厂模式的应用场景
- 设计模式学习笔记——抽象工厂模式
- 设计模式之JAVA----抽象工厂模式
- 设计模式之抽象工厂模式(Abstract Factory)
- C++设计模式从0进击-2-抽象工厂模式
- 抽象工厂模式
- 【重读设计模式】抽象工厂模式
- Java 抽象工厂模式
- 工厂方法模式与抽象工厂模式
- 二、创建型模式:抽象工厂模式(Abstract Factory)
- 设计模式------抽象工厂模式(AbstractFactoryPattern)
- 创建型模式--抽象工厂模式
- C#设计模式(4)——抽象工厂模式