设计模式之原型法(ProtoType)----对象创建型模式
来源:互联网 发布:特效制作用什么软件 编辑:程序博客网 时间:2024/05/11 21:38
设计模式之原型法(ProtoType)----对象创建型模式
1.意图
用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
2.适用性
1)当要实例化的类是在运行时刻指定时,例如,通过动态装载;或者
2)为了避免创建一个与产品类层次平行的工厂类层次时;或者
3)当一个类的实例只能有几个不同状态组合中的一种时。建立相应数目的原型并克隆它们可能比每次用合适的状态手工实例化该类更方便一些。
3.结构
4.参与者
*Prototype
---声明一个Clone自身的接口。
*ConcretePrototype
---实现一个Clone自身的操作。
Client
---让一个原型Clone自身从而创建一个新的对象。
5.协作
客户请求一个原型Clone自身。
6.例子:
/**********************************************************
*
*
*
* 生成一个游戏迷宫
*
*
**************************************************************/
class MazePrototypeFactory : public MazeFactory {
public:
MazePrototypeFactory(Maze*, Wall*, Room*, Door*);
virtual Maze* MakeMaze() const;
virtual Room* MakeRoom(int) const;
virtual Wall* MakeWall() const;
virtual Door* MakeDoor(Room*, Room*) const;
private:
Maze* _prototypeMaze;
Room* _prototypeRoom;
Wall* _prototypeWall;
Door* _prototypeDoor;
};
MazePrototypeFactory::MazePrototypeFactory (
Maze* m, Wall* w, Room* r, Door* d
) {
_prototypeMaze = m;
_prototypeWall = w;
_prototypeRoom = r;
_prototypeDoor = d;
}
Wall* MazePrototypeFactory::MakeWall () const {
return _prototypeWall->Clone();
}
Door* MazePrototypeFactory::MakeDoor (Room* r1, Room *r2) const {
Door* door = _prototypeDoor->Clone();
door->Initialize(r1, r2);
return door;
}
void dummy () {
MazeGame game;
MazePrototypeFactory simpleMazeFactory(
new Maze, new Wall, new Room, new Door
); //生成一个原型对象
Maze* maze = game.CreateMaze(simpleMazeFactory);//完成自身的Clone
}
/*为了改变迷宫的类型,我们用一个不同的原型集合来初始化MazeProtetypeFactory。下面调用一个BombedDoor一个RomWithAbomb创建一个迷宫:*/
void dummy2 () {
MazePrototypeFactory bombedMazeFactory(
new Maze, new BombedWall,
new RoomWithABomb, new Door
);
}
class Door : public MapSite {
public:
Door();
Door(const Door&);
virtual void Initialize(Room*, Room*);
virtual Door* Clone() const;
virtual void Enter();
Room* OtherSideFrom(Room*);
private:
Room* _room1;
Room* _room2;
};
Door::Door (const Door& other) {
_room1 = other._room1;
_room2 = other._room2;
}
void Door::Initialize (Room* r1, Room* r2) {
_room1 = r1;
_room2 = r2;
}
Door* Door::Clone () const {
//一个ConcretePrototype的Clone函数
return new Door(*this);
}
class BombedWall : public Wall {
public:
BombedWall();
BombedWall(const BombedWall&);
virtual Wall* Clone() const;
bool HasBomb();
private:
bool _bomb;
};
BombedWall::BombedWall (const BombedWall& other) : Wall(other) {
_bomb = other._bomb;
}
Wall* BombedWall::Clone () const {
return new BombedWall(*this);
}
- 设计模式之Prototype(原型模式)对象创建型
- 设计模式之对象创建型 — prototype 原型模式
- 设计模式之原型法(ProtoType)----对象创建型模式
- 设计模式学习之--PROTOTYPE(原型)对象创建型模型
- 面向对象设计模式之Prototype原型模式(创建型)
- 设计模式之十:Prototype(原型)—对象创建型模式
- (创建模式)设计模式之Prototype(原型)
- 设计模式:创建型模式:原型模式(prototype pattern)
- 设计模式笔记--创建型模式之四--原型prototype
- 设计模式(创建型)之原型模式(Prototype Pattern)
- 【设计模式】创建型模式之原型Prototype
- 创建型设计模式---原型模式(Prototype)
- 【创建型模式】原型模式(Prototype)之23种java设计模式
- 设计模式——创建型模式之原型模式(Prototype Pattern)
- Java设计模式之创建型模式-原型模式(Prototype)
- 原型模式(Prototype Pattern对象创建型模式)
- 创建型模式之原型(ProtoType)模式
- 创建型模式之原型模式(prototype)
- [翻译] Effective C++, 3rd Edition, Item 20: 用 pass-by-reference-to-const(传 const 引用)取代 pass-by-value(传值)(下)
- 一篇不错的演讲稿(职场必读 强烈推荐)!!!!
- 理想中的恋人
- QQ尾巴病毒的Visual C++实现探讨(转)
- 设计模式之 抽象工厂(Abstract Factory)---对象创建型模式
- 设计模式之原型法(ProtoType)----对象创建型模式
- 如何在lucene中使用中文自动分词技术- -
- 开发asp.net自定义控件(asp.net学习笔记三)
- 今天晚上的雨好大阿 (想了半天也不知道拿什么做主题。。。。呵呵。。。这雨下的)
- 非强类型dataset 和 强类型dataset 比较
- BORUI 软件 你们觉得她好用吗,有市场吗?
- 无法调试 ASP.NET 应用程序时出现"未将项目配置为进行调试"的错误信息
- 生成验证码
- 第五章 货币流通与货币制度