原型模式概述
用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
Prototype原型模式是一种创建型设计模式,Prototype模式允许一个对象再创建另外一个可定制的对象,根本无需知道任何如何创建的细节,工作原理是:通过将一个原型对象传给那个要发动创建的对象,这个要发动创建的对象通过请求原型对象拷贝它们自己来实施创建。
组成模型
客户(Client)角色:客户类提出创建对象的请求。
抽象原型(Prototype)角色:这是一个抽象角色,通常由一个C#接口或抽象类实现。此角色给出所有的具体原型类所需的接口。在C#中,抽象原型角色通常实现了ICloneable接口。
具体原型(Concrete Prototype)角色:被复制的对象。此角色需要实现抽象原型角色所要求的接口。
应对问题
它主要面对的问题是:“某些结构复杂的对象”的创建工作;由于需求的变化,这些对象经常面临着剧烈的变化,但是他们却拥有比较稳定一致的接口。
- #include <iostream>
- #include <cstring>
- /// 原型抽象类 -=> 对应于抽象原型(Prototype)角色
- class Prototype
- {
- public :
- Prototype( ){ };
- virtual ~Prototype( ){ };
- virtual Prototype* Clone( ) const = 0; // 拷贝函数,原型模式的精髓所在
- virtual void Show( ) const = 0; // 显示当前信息
- };
- /// 原型类A -=> 对应于具体原型(Concrete Prototype)角色:
- class PrototypeA : public Prototype
- {
- public :
- PrototypeA(const char *name = NULL) // 构造函数
- {
- if(name == NULL)
- {
- this->m_name = new char[1];
- strcpy(this->m_name, "");
- }
- else
- {
- this->m_name = new char[strlen(name) + 1];
- strcpy(this->m_name, name);
- }
- }
- PrototypeA(const PrototypeA &Prototype) // 实现深拷贝
- {
- this->m_name = new char[strlen(Prototype.m_name)];
- strcpy(this->m_name, Prototype.m_name);
- }
- virtual ~PrototypeA( ) // 虚析构函数
- {
- delete[] this->m_name;
- }
- Prototype* Clone( ) const // 拷贝函数,原型模式的精髓所在
- {
- return new PrototypeA(*this);
- }
- void Show( ) const // 显示当前函数信息
- {
- std::cout <<"PrototypeA's name is " <<this->m_name <<std::endl;
- }
- protected :
- char *m_name;
- };
- /// 原型类B -=> 对应于具体原型(Concrete Prototype)角色:
- class PrototypeB : public Prototype
- {
- public :
- PrototypeB(int no) // 构造函数
- {
- m_no = no;
- }
- PrototypeB(const PrototypeB &prototype) //
- {
- this->m_no = prototype.m_no;
- }
- virtual ~PrototypeB( ) // 虚析构函数
- {
- }
- Prototype* Clone( ) const // 拷贝函数,原型模式的精髓所在
- {
- return new PrototypeB(*this);
- } // 获取名字的函数
- void Show( ) const // 显示当前函数信息
- {
- std::cout <<"PrototypeB's no is " <<this->m_no <<std::endl;
- }
- protected :
- int m_no;
- };
- int main()
- {
- Prototype *r1 = new PrototypeA("A");
- Prototype *r2 = r1->Clone( );
- // r1和r2是相同内容的副本
- r1->Show( );
- r2->Show( );
- delete r1;
- delete r2;
- r1 = r2 = NULL;
- Prototype *r3 = new PrototypeB(10);
- Prototype *r4 = r3->Clone( );
- // r1和r2是用相同内容的拷贝
- r3->Show( );
- r4->Show( );
- delete r3;
- delete r4;
- r3 = r4 = NULL;
- return 0;
- }
转载:http://blog.csdn.net/gatieme/article/details/18001813