原型模式(Prototype)
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;">