设计模式简单代码之prototype模式(画圆篇)
2006-08-17 08:28
246 查看
/*************************************************************************************************************/
* 作者:一雨田(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;
}
* 作者:一雨田(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;
}
相关文章推荐
- 设计模式简单代码之prototype模式(画圆篇)
- 23种设计模式及简单代码
- 设计模式之简单工厂代码
- 设计模式简单代码之Memento模式
- 设计模式简单代码之Visitor模式
- 设计模式简单代码之Flyweight模式
- 设计模式简单代码之Bridge模式(画圆系统设计篇)
- 设计模式简单代码之一
- 设计模式简单代码之Proxy模式(买房子篇)
- 简单抽象工厂设计模式代码
- 设计模式简单代码之Iterator模式
- 设计模式简单代码之Visitor模式
- 设计模式简单代码之Iterator模式
- 设计模式简单代码之Composite模式(老师分配任务篇)
- 设计模式简单代码之Template Method模式(追MM篇)
- php设计模式 Prototype (原型模式)代码
- 设计模式(1)-使用简单工厂优化代码
- OC中KVC设计模式简单实用<代码演示>
- 设计模式思路和简单代码实现