原型模式(prototype)
原型模式用实例指定创建对象的种类,并且通过拷备原型创建新的对象。其实就是从一个已经实例化的对象创建另外一个一样的对象,同时向客户隐藏创建新对象的细节,新创建的对象是可订制的。
浅复制:被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象。换言之,浅复制仅仅复制所考虑的对象,而不复制它所引用的对象。
深复制:被复制对象的所有变量都含有与原来的对象相同的值,除去那些引用其他对象的变量。那些引用其他对象的变量将指向被复制过的新对象,而不再是原有的那些被引用的对象。换言之,深复制把要复制的对象所引用的对象都复制了一遍。
一般复制对象根据情况不同可以分为浅复制与深复制,C++中可以通过复制构造函数来实现对象的复制,对于浅复制,默认复制构造函数就可以实现了,对于深复制,则需要在复制构造函数中实现具体的复制代码。
以下代码实现的是浅复制:
Prototype.h
1 //Prototype.h 2 3 #ifndef _PROTOTYPE_H_ 4 #define _PROTOTYPE_H_ 5 6 class Prototype //原型基类 7 { 8 public: 9 virtual ~Prototype(); 10 virtual Prototype* Clone() const = 0; 11 protected: 12 Prototype(); 13 private: 14 }; 15 16 class ConcretePrototype: public Prototype //具体原型类 17 { 18 public: 19 ConcretePrototype(); 20 ConcretePrototype(const ConcretePrototype& cp); //复制构造函数 21 ~ConcretePrototype(); 22 Prototype* Clone() const; //自我复制函数 23 protected: 24 private: 25 }; 26 27 #endif
Prototype.cpp
1 //Prototype.cpp 2 3 #include "Prototype.h" 4 #include <iostream> 5 using namespace std; 6 7 Prototype::Prototype(){} 8 9 Prototype::~Prototype(){} 10 11 ConcretePrototype::ConcretePrototype(){} 12 13 ConcretePrototype::~ConcretePrototype(){} 14 15 ConcretePrototype::ConcretePrototype(const ConcretePrototype& cp) 16 { 17 cout << "ConcretePrototype copy..." << endl; 18 } 19 20 Prototype* ConcretePrototype::Clone() const 21 { 22 return new ConcretePrototype(*this); 23 }
main.cpp
1 //main.cpp 2 3 #include "Prototype.h" 4 #include <iostream> 5 using namespace std; 6 7 int main(int argc, char* argv[]) 8 { 9 Prototype* p1 = new ConcretePrototype(); 10 Prototype* p2 = p1->Clone(); 11 return 0; 12 }
这里对象本身就是一个生产对象的工厂了,只是这个工厂比较特殊,它是一个已经存在的对象。客户可以通过已经实例化的对象生产出新的对象,然后根据需要修改新对象的属性形成新的对象。