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

  原型模式,用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。


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

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

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

深复制结果:



浅复制结果:




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值