* 作者:一雨田(http://blog.csdn.net/dylgsy/)。本文可随便转贴,但请保留此信息
*
* prototype模式(原型模式),是一个使得新对象不用使用构造器来创建对象的模式
* 试想如果你要创建一个新对象,实际上这个对象已经创建过了,我不想再调用它的构造器来创建
* 那我能不能从这个已创建的对象身上“克隆”新的对象呢?呵呵,这就是PROTOTYPE模式,这个
* 已创建的对象就称为原型。下面我就给出个例子来说明
/*************************************************************************************************************/
/*************************************************************************************************************/
* 网上摘录的一段文字(觉得很清楚地说明了Prototype模式):
* 在一个图形编辑器中,每一个图形元素,如线、圆、文字等都应该支持拷贝操作,即点中图形,按下Ctrl+C,再按下Ctrl+V
* 后就会复制一个新的图形。显然这是一种clone操作。所以在每个从Graphic派生出的图形子类都应运用Prototype模式,
* 加上Clone操作
/*************************************************************************************************************/
/*************************************************************************************************************/
* 任务说明:
* 如果我们有一个画图系统(又是画图系统,可能没什么新意,但是画图系统对大家来说比较熟悉)。这个画图系统能画圆,
* 简单起见,就只能画圆吧.
* 画图的过程中会有好多圆,然而我们可能不想对每个圆都调用new操作(实际中可能这个对象的构建非常复杂,Builder对象).
* 我们就调用已经有的圆对象来做"克隆",就能生成新的圆了,然后再对新的对象设置属性,那就是一个全新的对象了.
/*************************************************************************************************************/
/*************************************************************************************************************/
* 另外想说,这里的代码以简单,容易理解为主,有不完善的地方请大家海涵
/*************************************************************************************************************/
#include <assert.h>
#include <iostream>
using namespace std;
class CPrototype
{
public:
virtual CPrototype* Clone() const = 0;
};
class CCircle: public CPrototype
{
public:
CCircle()
{
cout << "构造器建立的一个圆" << endl;
}
// 拷贝构造函数
CCircle(const CCircle &c)
{
// 注意,c是*this
strcpy(szBuf, c.szBuf);
}
virtual CPrototype* Clone() const
{
cout << "克隆一个圆,我会调用构造器哦" << endl;
// 这里如果返回的是智能指针,那客户程序就不用delete了
return new CCircle(*this);
}
void SetName(char *lpszName)
{
strcpy(szBuf, lpszName);
}
void What()
{
cout << "我是圆:" << szBuf << endl;
}
private:
char szBuf[100];
};
// 好,让我们使用这个画图系统
void main()
{
cout << "新建一个圆" << endl;
CCircle c1;
c1.SetName("1号");
c1.What();
// 注意这里的类型转换
CCircle *c2 = static_cast<CCircle *>(c1.Clone());
cout << "先看看复制回来的对象是什么:" << endl;
c2->What();
// 设置新对象名
cout << "我被设置了新名字,我现在是新对象了:" << endl;
c2->SetName("2号");
c2->What();
delete c2;
}