原型模式,用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
原型模式就是从一个对象再创建另外一个可定制的对象,而且不需要知道任何创建的细节。
其实,原型模式就是在原有的类中增加一个克隆函数,克隆一个和自身一样的对象。这其中就涉及到了深复制和浅复制,浅复制:被复制的对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用都仍然指向原来的对象。深复制:把引用的对象的变量指向复制过的新对象,而不是原有的被引用的对象。
在看这深复制与浅复制的时候,书上是以c#为例,.NET提供了一个IConeable接口,直接可以调用clone函数,于是在网上找了c++实现的方法,但是书上出现了浅复制的情况,我因为是在堆上重新分配了一个对象,然后*(该地址)赋于*(this),所以我并没有出现浅复制的情况,为此还找了一会c++浅复制的实现方法,最后发现,只要不分配内存的话就是浅复制了。
#include <iostream>
using namespace std;
class WorkExperience //工作经历类
{
string m_timeArea; //工作时间区间
string m_company; //工作地点
public:
void setwork(string timeArea, string company) //给时间地点赋值
{
m_timeArea = timeArea;
m_company = company;
}
string gettimeArea(){return m_timeArea;} //获取工作时间
string getcompany(){return m_company;} //获取工作地点
};
class Resume //简历
{
string m_name; //名字
string m_sex; //性别
string m_age; //年龄
WorkExperience *work; //工作经历实例
public:
Resume(){};
Resume(string name):m_name(name){}; //构造函数 传入名字
void setpersonalInfo(string sex, string age) //设置性别和年龄
{
m_sex = sex;
m_age = age;
work = new WorkExperience; //工作经历实例分配内存
}
void setworkExperience(string timeArea, string company) //设置工作经历
{
work->setwork(timeArea,company);
}
void display() //打印简历
{
cout<<m_name<<" "<<m_sex<<" "<<m_age<<endl;
cout<<"工作经历:"<<work->gettimeArea()<<" "<<work->getcompany()<<endl;
}
Resume* clone() //克隆简历
{
Resume* res = new Resume; //重新在堆上分配一块内存
*res = *this; //将this的所有值拷贝到res(深复制)
// Resume* res = this; //将this地址给res (浅复制)
return res; //将res返回
}
};
int main()
{
Resume *a = new Resume("小明");
a->setpersonalInfo("男", "21");
a->setworkExperience("2014-09","微软");
Resume *b = a->clone();
b->setpersonalInfo("男", "23");
b->setworkExperience("2016-09","谷歌");
Resume *c = b->clone();
c->setpersonalInfo("男", "27");
c->setworkExperience("2016-09","华为");
a->display();
b->display();
c->display();
return 0;
}
深复制结果:
浅复制结果: