标签:
解决的问题:
用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象.
这个其实和C++的拷贝构造函数的作用是一致的, 实际上就是动态抽取当前对象运行时的状态(好吧, 其实我还没弄懂两者的区别, 请大牛赐教).
C++的拷贝构造函数分为浅拷贝和深拷贝.
浅拷贝:就是给对象中的每个成员变量进行复制, 就是把A1类中的变量直接赋给A2类中变量, 属于值传递, 但是涉及到有指针类型的成为, 它们指向的是同一块内存. 这就出现了问题:当B把内存释放了(如:析构), 这时A内的指针就是野指针了, 出现运行错误.
深拷贝:就是不仅使用值传递, 而是要每个变量都有自己一份独立的内存空间, 互不干扰.
原型模式 UML 类图:
以下代码摘自: 《C++设计模式——原型模式》
/* ** FileName : PrototypePatternDemo ** Author : Jelly Young ** Date : 2013/11/25 ** Description : More information, please go to http://www.jellythink.com */ #include <iostream> using namespace std; //接口 class Prototype { public : Prototype(){} virtual ~Prototype(){} virtual Prototype * Clone() = 0; }; //实现 class ConcretePrototype : public Prototype { public : ConcretePrototype():m_counter(0){} virtual ~ConcretePrototype(){} //拷贝构造函数 ConcretePrototype( const ConcretePrototype & rhs) { m_counter = rhs .m_counter; } //复制自身 virtual ConcretePrototype * Clone() { //调用拷贝构造函数 return new ConcretePrototype (*this ); } private : int m_counter; }; int main(int argc , char **argv) { //生成对像 ConcretePrototype * conProA = new ConcretePrototype (); //复制自身 ConcretePrototype * conProB = conProA->Clone(); delete conProA; conProA= NULL ; delete conProB; conProB= NULL ; return 0; }
基本就是需要从A的实例得到一份与A内容相同, 但是又互不干扰的实例的话, 就需要使用原型模式.
举例说明(可能是错的..):
我们玩游戏打副本时, 有的游戏会这么设计, 在进副本前保存当前的人物状态, 然后打完副本后恢复前进副本前的状态, 此时是不是就可以应用原型模式? 进副本前复制一个当前角色的实例, 然后进副本后用复制出来的新实例来维护角色, 退出副本时又使用旧的实例...
标签:
原文地址:http://www.cnblogs.com/hanxiao-martin/p/4292301.html