1.概述
原型模式就是通过复制现在已经存在的对象来创建一个新的对象。
工作原理:将一个原型对象传给那个要发动创建的对象,这个要发动创建的对象通过请求原型对象拷贝自己来实现创建过程。
2.角色
客户(Client)角色:客户端类向原型管理器提出创建对象的请求。
抽象原型(Prototype)角色:这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体原型类所需的接口。
具体原型(Concrete Prototype)角色:被复制的对象。此角色需要实现抽象的原型角色所要求的接口。
原型管理器(Prototype Manager)角色:创建具体原型类的对象,并记录每一个被创建的对象。
3优缺点
优点:
1)允许动态地增加或减少产品类。且增加新产品对整个结构没有影响。
2)提供简化的创建结构。工厂方法常需要有一个与产品类相同的等级结构,而原型模式不需要。
3)产品类不需要非得有任何事先确定的等级结构,因为原型模式适用于任何的等级结构。
缺点:
1) 每一个类必须配备一个克隆方法。
浅复制和深复制
浅拷贝: 对值类型的成员变量进行值的复制,对引用类型的成员变量只复制引用,不复制引用的对象。
深拷贝: 对值类型的成员变量进行值的复制,对引用类型的成员变量也进行引用对象的复制.
4 与new的区别
有的时候,创建实例的构造函数非常的复杂,在执行这个构造函数时会消耗较长的时间,同时,这个构造函数中的一些信息又没有什么变化
那么直接使用 new 来创建这样一个实例就显得太昂贵了。这时候就可以使用原型模式。
5. 使用场景
以下的几个场景的时候,可能使用原型模式更简单也效率更高。
1)当一个系统应该独立于它的产品创建、构成和表示时。
2)当要实例化的类是在运行时刻指定时,例如,通过动态装载。
3)为了避免创建一个与产品类层次平行的工厂类层次时。
4)当一个类的实例只能有几个不同状态组合中的一种时。
比如在画图工具里,要画圆只需要拖动工具条的画圆工具到绘图区即可,而不需要从头开始一点一点的画一个圆,而且如果需要不同大小和颜色的圆,只需要复制几个圆,然后再修改他们的大小和颜色即可。
6.代码实现
1)不带原型管理器
http://blog.csdn.net/wuzhekai1985/article/details/6667020
1 class Resume 2 { 3 protected: 4 char *name; 5 public: 6 virtual Resume* Clone(){return NULL;} 7 virtual void Set(char *n){} 8 virtual void Show(){} 9 }; 10 11 class ResumeA: public Resume 12 { 13 public: 14 ResumeA(const char *str) 15 { 16 if(str == NULL) 17 { 18 name = new char[1]; 19 name[0] = '