Prototype模式
目录 |
1 问题
关于这个模式,突然想到了小时候看的《西游记》,齐天大圣孙悟空再发飙的时候可以通过自己头上的3根毛立马复制出来成千上万的孙悟空,对付小妖怪很管用(数量最重要)。Prototype模式也正是提供了自我复制的功能,就是说新对象的创建可以通过已有对象进行创建。在C++中拷贝构造函数(Copy Constructor)曾经是很对程序员的噩梦,浅层拷贝和深层拷贝的魔魇也是很多程序员在面试时候的快餐和系统崩溃时候的根源之一。
2 功能
用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
3 结构图

Prototype模式提供了一个通过已存在对象进行新对象创建的接口(Clone),Clone()实现和具体的实现语言相关,在C++中我们将通过拷贝构造函数实现之。
4 优缺点
优点:复制自身。客户不知道需要对象的实际类型,只需知道它的抽象基类即可。(即有继承树的情况)
缺点:必须先有一个对象实例(即原型)才能clone。
5 示例代码
namespace DesignPattern_Prototype { // class Prototype class Prototype //抽象基类 { public: virtual Prototype* Clone() = 0 ; } ; // class ConcretePrototype1 class ConcretePrototype1 : public Prototype { public: virtual Prototype* Clone() { ConcretePrototype1 *p = new ConcretePrototype1() ; *p = *this ; //复制对象 return p ; } } ; // class ConcretePrototype2 class ConcretePrototype2 : public Prototype { public: virtual Prototype* Clone() { ConcretePrototype2 *p = new ConcretePrototype2() ; *p = *this ; //复制对象 return p ; } } ; }
客户端代码:
{ using namespace DesignPattern_Prototype ; ConcretePrototype1 *obj1 = new ConcretePrototype1() ;//原型对象1 ConcretePrototype2 *obj2 = new ConcretePrototype2() ;//原型对象2 Prototype *newobj1 = obj1->Clone() ;//克隆对象1 Prototype *newobj2 = obj2->Clone() ;//克隆对象2 //使用复制出的对象newobj1和newobj2 }
6 实例
在一个图形编辑器中,每一个图形元素,如线、圆、文字等都应该支持拷贝操作,即点中图形,按下Ctrl+C,再按下Ctrl+V后就会复制一个新的图形。显然这是一种clone操作。所以在每个从Graphic派生出的图形子类都应运用Prototype模式,加上Clone操作。
7 讨论
Prototype模式通过复制原型(Prototype)而获得新对象创建的功能,这里Prototype本身就是“对象工厂”(因为能够生产对象),实际上Prototype模式和Builder模式、AbstractFactory模式都是通过一个类(对象实例)来专门负责对象的创建工作(工厂对象),它们之间的区别是:Builder模式重在复杂对象的一步步创建(并不直接返回对象),AbstractFactory模式重在产生多个相互依赖类的对象,而Prototype模式重在从自身复制自己创建新类。
8 参见
- c++设计模式(4)-Prototype. Henry. 2008-08-29 22:56.
- 设计模式解析之——PROTOTYPE模式. K_Eckel. 2005-04-05.