设计模式简单代码之prototype模式(画圆篇)

/*************************************************************************************************************/

* 作者:一雨田(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;
}

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值