设计模式学习--原型模式(深复制与浅复制)
2017-04-17 00:00
316 查看
原型模式,用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
原型模式就是从一个对象再创建另外一个可定制的对象,而且不需要知道任何创建的细节。
其实,原型模式就是在原有的类中增加一个克隆函数,克隆一个和自身一样的对象。这其中就涉及到了深复制和浅复制,浅复制:被复制的对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用都仍然指向原来的对象。深复制:把引用的对象的变量指向复制过的新对象,而不是原有的被引用的对象。
在看这深复制与浅复制的时候,书上是以c#为例,.NET提供了一个IConeable接口,直接可以调用clone函数,于是在网上找了c++实现的方法,但是书上出现了浅复制的情况,我因为是在堆上重新分配了一个对象,然后*(该地址)赋于*(this),所以我并没有出现浅复制的情况,为此还找了一会c++浅复制的实现方法,最后发现,只要不分配内存的话就是浅复制了。
深复制结果:
浅复制结果:
原型模式就是从一个对象再创建另外一个可定制的对象,而且不需要知道任何创建的细节。
其实,原型模式就是在原有的类中增加一个克隆函数,克隆一个和自身一样的对象。这其中就涉及到了深复制和浅复制,浅复制:被复制的对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用都仍然指向原来的对象。深复制:把引用的对象的变量指向复制过的新对象,而不是原有的被引用的对象。
在看这深复制与浅复制的时候,书上是以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; }
深复制结果:
浅复制结果:
相关文章推荐
- 设计模式之原型学习 java中的浅复制和深复制
- 设计模式学习--原型模式(深复制与浅复制)
- 设计模式学习笔记九:原型模式(和深浅复制)
- 设计模式学习笔记九:原型模式(和深浅复制)
- 设计模式学习之工厂方法模式和原型模式
- 步步为营 .NET 设计模式学习笔记 五、Prototype(原型模式)
- 设计模式学习-每日一记(6.原型模式)
- 设计模式学习笔记(十一)—Prototype原型模式
- 设计模式学习-Prototype(原型)
- “设计模式”学习之二:单件、原型与生成器模式
- 设计模式学习-Prototype(原型)
- HeadFirst 设计模式学习笔记19--原型(Prototype)模式拾零
- 设计模式学习之--原型模式(Prototype)
- 【设计模式学习笔记1】原型法
- 阿Sam的设计模式学习笔记---- 原型(Prototype)模式
- 设计模式学习笔记(六)——Prototype原型模式
- 设计模式学习笔记九:原型模式(Prototype Pattern)
- .Net设计模式学习笔记(六):原型模式(Prototype Pattern)
- 设计模式学习----Prototype原型模式
- java设计模式---Prototype Pattern---原型模式(复制建立对象)