Prototype

原型模式:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。提供了一个通过已存在对象进行新对象创建的接口,在C++中使用拷贝构造函数。
Java中通过覆盖父类Object的clone方法实现,继承接口Cloneable,此接口无任何方法,只起一个标记作用, 具有这个标记的对象才有可能被拷贝。
Public class PrototypeClass implements Cloneable
{
Public PrototypeClass clone()
{
PrototypeClass prototypeClass = null;
Try
{
prototypeClass = (PrototypeClass)super.clone();
}
Catch (CloneNotSupportedException e)
{
}
return prototypeClass;
}
优点:
1、 性能优良:内存二进制流的拷贝,比直接new一个对象性能好,特别是在一个循环体内产生大量的对象时。
2、 逃避了构造函数的约束:直接内存拷贝,构造函数不执行。
使用场景:
1、 资源优化场景:类初始化需要非常多的资源
2、 性能和安全要求的场景:new需要非常频繁的数据准备和访问权限
3、 一个对象对个修改者得场景:拷贝多个对象供使用者修改
注意:浅拷贝和深拷贝
CWinApp theApp;
using namespace std;
class Prototype
{
public:
virtual ~Prototype();
virtual Prototype* Clone() const = 0; //纯虚函数,抽象类
protected:
Prototype();
private:
};
Prototype::Prototype()
{
}
Prototype::~Prototype()
{
}
Prototype* Prototype::Clone() const
{
return 0;
}
class ConcretePrototype:public Prototype
{
public:
ConcretePrototype(int num, char * name);
ConcretePrototype(const ConcretePrototype& cp);
~ConcretePrototype();
Prototype* Clone() const;
protected:
private:
int Num;
char *pname;
};
ConcretePrototype::ConcretePrototype(int num, char*name)
{
int length=strlen(name);
pname=new char[length+1];
if(pname!=0)
strcpy(pname,name);
Num = num;
cout<<"构造函数执行"<<pname<<endl;
}
ConcretePrototype::~ConcretePrototype()
{
}
//拷贝构造函数
ConcretePrototype::ConcretePrototype(const ConcretePrototype& cp)
{
cout<<"拷贝构造函数执行 ..."<<endl;
Num = cp.Num;
int len = strlen(cp.pname);
pname = new char[len+1];
if(pname!=0)
{
strcpy(pname,cp.pname);
}
cout<<Num<<endl;
cout<<pname<<endl;
}
Prototype* ConcretePrototype::Clone() const
{
return new ConcretePrototype(*this);
}
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
int nRetCode = 0;
// initialize MFC and print and error on failure
if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
{
// TODO: change error code to suit your needs
cerr << _T("Fatal Error: MFC initialization failed") << endl;
nRetCode = 1;
}
else
{
// TODO: code your application's behavior here.
//Prototype q;
Prototype* p = new ConcretePrototype(1,"zhaohailiang");
Prototype* p1 = p->Clone();
delete p;
CString strHello;
strHello.LoadString(IDS_HELLO);
cout << (LPCTSTR)strHello << endl;
char b;
cin >> b;
}
return nRetCode;
}
本文详细介绍了原型模式的概念及其在C++和Java中的实现方式。通过示例代码解释了如何使用拷贝构造函数和clone方法来创建对象副本。探讨了原型模式的优点及适用场景,并对比了浅拷贝与深拷贝的区别。
1444

被折叠的 条评论
为什么被折叠?



