您的位置:首页 > 其它

设计模式 Design Parttern ——原型Prototype

2010-10-14 15:36 756 查看
设计模式 Design Parttern ——原型Prototype
http://blog.csdn.net/leeidea

1:头文件
#ifndef _PROTOTYPE_H_VANEY_
#define _PROTOTYPE_H_VANEY_

#include <iostream>
using namespace std;
/******************************************************************
名称  :Prototype.h
版本  :1.00
描述  :演示原型设计模式的概念
作者  :vaney.li@gmail.com http://blog.csdn.net/leeidea 日期  :2010年10月14日
版权  :vaney.li@gmail.com http://blog.csdn.net/leeide 参考  :http://www.shenmiguo.com/archives/2009/293_design-patterns-prototype.html
******************************************************************/

/*
官方解释:The Prototype pattern specifies the kind of objects to instantiate using a
prototypical instance.

我的理解:
1.       Prototype是原型基类,提供Clone纯虚方法,它根据不同的派生类来克隆不同的对象。
2.       ConcretePrototype是原型具体类。实现Clone方法,克隆自己,返回克隆后的新对象。
3.       Client调用基类Clone接口,就可以得到一个克隆对象。

要点
1.       原型模式中,Client并不知道要克隆对象的实际类型,只需知道基类类型即可。
2.       克隆对象比直接创建对象的优点在于,克隆是将原有对象的行为属性带到了新的对象中。
3.       C++没有克隆方法,要克隆一个对象,需要借助拷贝构造函数(Copy Constructor)来实
现。拷贝构造函数中实现拷贝对象有浅拷贝和深拷贝:浅拷贝是指对象复制时,只是对于
对象中的数据成员进行值拷贝;深拷贝是指对象赋值时,对于对象的简单数据成员进行值
拷贝,对于对象中的动态成员(堆或者其他系统资源),要重新分配动态空间。
当类不定义拷贝构造函数的时候,编译器会自动生一个构造函数,叫做默认拷贝构造函数。
默认拷贝构造函数使用浅拷贝方式。如果类中含有动态数据成员,就必须使用深拷贝方式
实现拷贝构造函数,否则,在销毁对象时,两个对象的析构函数将对同一个内存空间释放
两次,产生运行时错误。

我的应用:

*/
//原型基类
class CPrototype
{
public:
CPrototype(void)
{
cout << "CPrototype()" << endl;
}
virtual ~CPrototype(void)
{
cout << "~CPrototype()" << endl;
}

public:

//需要子类实现的方法
virtual CPrototype* Clone() = 0;
};

//具体的原型
class CPrototypeA : public CPrototype
{

int _id;
public:
CPrototypeA(int id):_id(id)
{
cout << "CPrototypeA()" << endl;
}
CPrototypeA(const CPrototypeA& a)
{
_id = a._id;
}
virtual ~CPrototypeA(void)
{
cout << "~CPrototypeA()" << endl;
_id = 0;
}

public:
virtual CPrototype* Clone()
{
return new CPrototypeA(*this);
}

};

//具体的原型
class CPrototypeB : public CPrototype
{

char* _name;
public:
CPrototypeB(char* name)
{
cout << "CPrototypeB()" << endl;
if(name)
{
int len = strlen(name);
_name = (char*)malloc(len + 1);
strcpy(_name,name);
}
else
{
_name = 0;
}

}
CPrototypeB(const CPrototypeB& b)
{
if(b._name)
{
int len = strlen(b._name);
_name = (char*)malloc(len + 1);
strcpy(_name,b._name);
}
else
{
_name = 0;
}

}
virtual ~CPrototypeB(void)
{
cout << "~CPrototypeB()" << endl;
if(_name)
free(_name);
_name = 0;
}

public:
virtual CPrototype* Clone()
{
return new CPrototypeB(*this);
}

};

#define  C_API  extern "C"
//用户
C_API int UsingPT();
#endif


2:源文件

#include "Prototype.h"
C_API int UsingPT()
{
/*
创建typeA,然后克隆一个typeA
*/
CPrototypeA* typeA = new CPrototypeA(10);
CPrototypeA* clonedA = dynamic_cast<CPrototypeA*>(typeA->Clone());

/*
创建typeB,然后克隆一个typeB
*/
CPrototypeB* typeB = new CPrototypeB("vaney");
CPrototypeB* clonedB = dynamic_cast<CPrototypeB*>(typeB->Clone());

return 1;
}


3:用户文件main.c

extern int UsingPT();
//系统默认入口
int _tmain(int argc, _TCHAR* argv[])
{

return UsingPT();

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: