Prototype模式是一种对象创建型模式,它采取复制原型对象的方法来创建对象的实例。使用Prototype模式创建的实例,具有原型一样的数据。
1) 由原型对象自身创建目标对象。也就是说,对象创建这一动作发自原型对象本身。
2) 目标对象是原型对象的一个克隆。也就是说,通过Prototype模式创建的对象,不仅仅是与原型对象具有相同的结构,还与原型对象有相同的值。
3) 根据对象克隆深度层次的不同,有浅度克隆和深度克隆。
Prototype模式也正是提供了自我复制的功能,就是说新对象的创建可以通过已有对象进行创建。在C++中拷贝构造函数(Copy Constructor)曾经是很对程序员的噩梦,浅层拷贝也是面试的重点之一。

图2-1:Prototype Pattern结构图
应用场景:
“某些结构复杂的对象” 的创建工作,由于需求的变化,这些对象经常面临着巨大的变化,但是它们却拥有比较稳定一致的接口。 一个复杂对象具有自我复制功能,同一一套接口。
代码如下:
#include <iostream>
using namespace std;
class Pro
{
public:
virtual Pro* clone() = 0;
virtual void print() = 0;
};
class CPlusPlusPro : public Pro
{
public:
CPlusPlusPro(string name, string job)
{
m_job = job;
m_name = name;
}
CPlusPlusPro(CPlusPlusPro &cpp)
{
m_name = cpp.m_name;
m_job = cpp.m_job;
}
virtual void print()
{
cout << m_name << " : " << m_job << endl;
}
virtual Pro* clone()
{
return new CPlusPlusPro(*this);
}
public:
string m_name;
string m_job;
};
int main()
{
CPlusPlusPro *tmp = new CPlusPlusPro("tom", "engineer");
tmp->print();
Pro *cpp = tmp->clone();
cpp->print();
delete cpp;
delete tmp;
return 0;
}
总结:
Prototype模式通过复制原型(Prototype)而获得新对象创建的功能,这里Prototype本身就是“对象工厂”(因为能够生产对象),实际上Prototype模式和Builder模式、AbstractFactory模式都是通过一个类(对象实例)来专门负责对象的创建工作(工厂对象),它们之间的区别是:Builder模式重在复杂对象的一步步创建(并不直接返回对象),<span data-wiz-span="data-wiz-span" style="font-family: 'Times New Roman'; font-size: 1rem;">C9E8BCC6C4A3CABDBEABBDE2A3AD476F46203233D6D6C9E8BCC6C4A3CABDBDE2CEF6B8BD432B2BCAB5CFD6D4B4C2EBC9E8</span>AbstractFactory模式重在产生多个相互依赖类的对象,而Prototype模式重在从自身复制自己创建新类。
<wiz_tmp_tag id="wiz-table-range-border" contenteditable="false" style="display: none;">