一、UML图
二、包含的角色
IProtoType类,定义一个克隆自身的接口Clone()
ConcreteProtoType1、ConcreteProtoType2等等,实现一个克隆自身的Clone()操作
Client类,调用方法,Operation,让一个原型克隆自身,创建一个新的对象
三、特点
定义:原型模式(ProtoType),用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
1.原型模式实际上就是从一个对象再创建另外一个可定制的对象,而且不需要任何创建细节。
2.一般在初始化的信息不发生变化的情况下,克隆是最好的办法,这基因长了对象创建的细节,又对性能是大大的提高。因为如果不用Clone,每次new,都需要执行一次构造函数,如果构造函数执行时间很长,那么多次多次执行这个初始操作就实在是太低效了。
3.浅拷贝和深拷贝
浅拷贝:被复制的对象的所有变量含有与原来的对象相同的值,而所有对其他对象的引用都仍然指向原来的对象。
深拷贝:把引用对象的变量指向复制过的新对象,而不是原有的被引用的对象。
四、代码实现
C++版
IProtoType类
class IPrototype
{
public:
IPrototype() {}
virtual ~IPrototype() {}
virtual IPrototype *Clone() = 0;
};
ConcretePrototype1、ConcreteProtoType2类
#include "IProtoType.h"
#include <string>
class ConcretePrototype2: public IProtoType {
public:
std::string id;
IProtoType* Clone()
{
return this;
}
public:
ConcretePrototype2(std::string id)
{
this->id = id;
}
};
Client Operation
void Operation() {
ConcretePrototype1 *p1 = new ConcretePrototype1();
ConcretePrototype1 *c1 = (ConcretePrototype1 *) p1->Clone();
delete p1;
p1 = nullptr;
delete c1;
c1 = nullptr;
}
以上例子为浅拷贝,意在说明这类设计模式。深拷贝的方式不在这里说明。