您的位置:首页 > 其它

设计模式学习--原型模式(深复制与浅复制)

2017-04-17 00:00 316 查看
  原型模式,用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。



  原型模式就是从一个对象再创建另外一个可定制的对象,而且不需要知道任何创建的细节。

  其实,原型模式就是在原有的类中增加一个克隆函数,克隆一个和自身一样的对象。这其中就涉及到了深复制和浅复制,浅复制:被复制的对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用都仍然指向原来的对象。深复制:把引用的对象的变量指向复制过的新对象,而不是原有的被引用的对象。

  在看这深复制与浅复制的时候,书上是以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;
}


深复制结果:



浅复制结果:

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