原型模式就是从一个对象再创建另一个可定制的对象,而且不需要知道任何创建的细节。书中的定义为:原型模式(Prototype),用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
个人理解为定义一个抽象接口Prototype,然后在其中定义一个纯虚函数Clone。再定义一个创建原型的类concretePrototype来定义属性并实现Clone方法,克隆自身并返回新的对象。
其中由于C++ 中没有ICloneable接口,所以我们可以通过拷贝构造函数去实现对象的拷贝,这里又涉及到浅拷贝和深拷贝。深拷贝和浅拷贝的定义可以简单理解成:如果一个类拥有资源(堆,或者是其它系统资源),当这个类的对象发生复制过程的时候,这个过程就可以叫做深拷贝,反之对象存在资源,但复制过程并未复制资源的情况视为浅拷贝。也就是浅拷贝并没有创建资源,而是新的对象指针指向原来的对象,并且公用空间,而深拷贝就是创建新的空间,并把要拷贝对象的值拷贝过来。
下面为实践的代码:
#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std;
class Prototype
{
public:
virtual Prototype *Clone()=0;
};
class resume : public Prototype
{
public:
resume(){}
resume(string name)
{
this->name = name;
}
resume(resume &re)
{
this->name = re.name;
this->sex = re.sex;
this->age = re.age;
this->timeArea = re.timeArea;
this->company = re.company;
}
void SetPersonalInfo(string sex,string age)
{
this->sex = sex;
this->age = age;
}
void SetWorkExperience(string timeArea,string company)
{
this->timeArea = timeArea;
this->company = company;
}
void Display()
{
cout<<name<<" "<<sex<<" "<<age<<endl;
cout<<"工作经历:"<<timeArea<<" "<<company<<endl;
}
Prototype *Clone()
{
return new resume(*this);
}
private:
string name;
string sex;
string age;
string timeArea;
string company;
};
int _tmain(int argc, _TCHAR* argv[])
{
resume *a = new resume("dada");
a->SetPersonalInfo("man","23");
a->SetWorkExperience("2008-2012","Microsoft");
resume *b =(resume *)a->Clone();
b->SetPersonalInfo("man","23");
b->SetWorkExperience("2010-2012","Microsoft");
a->Display();
b->Display();
system("pause");
delete a;
delete b;
return 0;
}
原型模型主要的优点是:在一般初始化的信息不发生变化的情况下,隐藏了对象创建的细节。
但是C#中说的可以不执行构造函数而动态地获得对象运行的状态这一点我就有点迷糊了?C++中也能这样吗?要是这样真的可以大大提高性能,尤其是在一些构造函数执行时间较长的情况下。