【设计模式】创建型模式之原型Prototype
来源:互联网 发布:csocket编程详解 编辑:程序博客网 时间:2024/05/16 10:17
原型Prototype是一种创建型设计模式,意在用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。原型Prototype是一种创建型设计模式,意在用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
当一个系统应该独立于它的产品创建、构成和表示时,或者当要实例化的类是运行时刻指定时,或者为了避免创建一个与产品类层次平行的工厂类层次时,或者当一个类的实例只能有几个不同状态组合中的一种时,我们可以尝试使用Prototype,建立相应数目的原型并克隆它们,可能比每次用合适的的状态手工实例化该类更方便一些。
Prototype的类图如下:
Prototype类声明一个克隆自身的接口clone,ConcretePrototype类实现一个克隆自身的操作clone,Client在其operation方法中让一个原型克隆自身从而创建一个新的对象。
原型对客户隐藏了具体的产品类,客户无需改变就可以使用与特定应用相关的类。实际上,克隆一个原型类似于实例化一个对象,需要支持拷贝,但比实例化方便,可以极大的较少系统所需要的类的数目。
下面以一个例子说明原型的用法。例子中,与Prototype对应的为Traffic类,是个抽象类,声明了一个clone接口,另外的initialize方法并不是必需的,需要时可用于对clone出来的对象作一些初始化工作;与ConcretePrototype对应的是Plane,实现了clone方法,因为调用了拷贝构造函数,我们需要根据实际情况定义这个拷贝构造函数,是浅拷贝还是深拷贝;与Client对应的是TrafficClient类,重点为构造函数的参数及makeTraffic方法中对clone的调用。
例子代码如下:
class Traffic{public: virtual Traffic* clone() const = 0; virtual void initialize() {}};class Plane : public Traffic{public: Plane() {} Plane(const Plane&) {} Traffic* clone() const { return new Plane(*this); }};class TrafficClient{public: TrafficClient(Traffic *traffic) : m_pPrototypeTraffic(traffic) {} Traffic* makeTraffic() const { if (m_pPrototypeTraffic) { return m_pPrototypeTraffic->clone(); } return 0; }private: Traffic *m_pPrototypeTraffic;};
测试代码如下:
TrafficClient tc(new Plane); tc.makeTraffic();
- (创建模式)设计模式之Prototype(原型)
- 设计模式笔记--创建型模式之四--原型prototype
- 设计模式之Prototype(原型模式)对象创建型
- 设计模式(创建型)之原型模式(Prototype Pattern)
- 【设计模式】创建型模式之原型Prototype
- 设计模式之对象创建型 — prototype 原型模式
- 创建型设计模式---原型模式(Prototype)
- 创建型模式之原型(ProtoType)模式
- 创建型模式之原型模式(prototype)
- 创建型模式之原型模式PROTOTYPE
- 设计模式学习之--PROTOTYPE(原型)对象创建型模型
- [设计模式-创建型]原型(Prototype)
- 设计模式-创建型-prototype 原型
- 设计模式:创建型模式:原型模式(prototype pattern)
- 创建模式之Prototype(原型)
- 创建模式之Prototype(原型)
- 设计模式之Prototype(原型)
- 设计模式之Prototype(原型)
- 最简短总结-整数快速幂
- 《深入理解mybatis原理(四)》 MyBatis的二级缓存的设计原理
- 双调旅程(bitonic tour)问题(POJ2677、ZOJ2096)
- android shape详解
- 重积分和线面积分总结
- 【设计模式】创建型模式之原型Prototype
- Android SurfaceView实战 打造抽奖转盘
- serservlet 一生
- CodeForces 638 A Home Numbers(水。)
- 使用maven mvn archetype:create 创建maven项目出错
- python unittest 之mock学习笔记(续一)
- scala学习之scala与java的一些区别(一)
- 《JavaScript学习笔记四》:getElementsByTagName的使用以及全选、反选和取消功能实现
- Cache——缓存