c++设计模式(22)-Abstract Factory模式
来源:互联网 发布:枪械百科软件 编辑:程序博客网 时间:2024/06/01 19:51
一、功能
提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
二、结构图
类厂最基本的结构示意图如下:
在实际应用中,类厂模式可以扩充到很复杂的情况,如下图所示:
三、优缺点
优点:(1)封装创建过程。客户不用知道类厂是如何创建类实例的,类厂封闭了所有创建的细节。这样可选择不同的创建方法,增加了灵活性。 (2)将客户与具体类隔离,提高了各自的可重用性。
缺点:Factory类层次与具体类层次通常是平行的(即一一对应的)。增加一个具体类,一般也要相应地增加一个factory类,增加了系统复杂度。
四、实现
(1)通常可以把工厂作为单件。
抽象工厂(Abstract Factory)模式看起来和前面看到的工厂方法很相似,只是它使用若干工厂方法(Factory Method)模式。每个工厂方法模式创建一个不同类型的对象。当创建一个工厂对象时,要决定将如何使用由那个工厂创建的所有对象。示例代码如下(假设要创建一个通用的游戏环境,并且希望它能支持不同类型的游戏):
#include<iostream>
using namespace std;
class Obstacle
{
public:
virtual void action()=0;
};
class Player
{
public:
virtual void interactWith(Obstacle*)=0;
};
class Kitty: public Player
{
virtual void interactWith(Obstacle *ob)
{
cout<<"Kitty has encountered a";
ob->action();
}
};
class KungFuGuy: public Player
{
virtual void interactWith(Obstacle* ob)
{
cout<<"KungFuGuy now battles against a";
ob->action();
}
};
class Puzzle: public Obstacle
{
public:
void action(){cout<<"Puzzle"<<endl;}
};
class NastyWeapon: public Obstacle
{
public:
void action(){cout<<"NastyWeapon"<<endl;}
};
//the abstract factory
class GameElementFactory
{
public:
virtual Player* makePlayer()=0;
virtual Obstacle* makeObstacle()=0;
};
//concreate factories
class KittiesAndPuzzles:public GameElementFactory
{
public:
virtual Player* makePlayer(){return new Kitty;}
virtual Obstacle * makeObstacle(){return new Puzzle;}
};
class KillAndDismember:public GameElementFactory
{
public:
virtual Player* makePlayer(){return new KungFuGuy;}
virtual Obstacle *makeObstacle(){return new NastyWeapon;}
};
class GameEnvironment
{
GameElementFactory* gef;
Player* p;
Obstacle *ob;
public:
GameEnvironment(GameElementFactory * factory):gef(factory),p(factory->makePlayer()),ob(factory->makeObstacle())
{
}
void play()
{
p->interactWith(ob);
}
~GameEnvironment()
{
delete p;
delete ob;
delete gef;
}
};
int main()
{
GameEnvironment;
g1(new KittiesAndPuzzles);
g2(new KillAndDismember);
g1.play();
g2.play();
}
在此环境中,Player对象与Obstacle 对象交互,但是Player和Obstacle类型依赖于具体的游戏。可以选择特定的GameElementFactory来决定游戏的类型,然后GameEnvironment控制游戏的设置和进行。在本例中,游戏的设置和进行很简单,但是那些动作在很大程度上决定了游戏的结果。
- 设计模式(Abstract Factory)
- 设计模式-Abstract Factory
- 设计模式--Abstract Factory
- c++设计模式(22)-Abstract Factory模式
- 设计模式-Abstract Factory模式
- 设计模式 - Abstract Factory模式
- 设计模式--Abstract Factory模式
- 乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factory Pattern)
- Delphi设计模式-Abstract Factory
- 设计模式一:abstract factory
- [.NET 设计模式] Abstract Factory
- 设计模式之: abstract factory
- 设计模式之Abstract Factory
- 设计模式之ABSTRACT FACTORY
- [设计模式]4. Abstract Factory
- 设计模式之二 abstract factory模式
- 设计模式(四):Abstract Factory模式
- 设计模式(四):Abstract Factory模式
- httpModules 与httpHandler
- zoj 2520
- 如何反映主数据的历史变化?(转)
- c++设计模式(21)-Façade模式
- Eclipse中program arguments 与 VM arguments的区别
- c++设计模式(22)-Abstract Factory模式
- Android2.3中Webkit引擎导致VM崩溃的问题
- gdb调试,分析core文件,找出段错误位置
- java基础加强(一)
- Delphi OleVariant 类型的用法
- LO数据抽取步骤
- 大三了,我应该怎么办?
- 流量监控
- 关于CTS中android.permission.cts.DebuggableTest# testNoDebuggable Fail