大话设计模式C++实现-第9章-原型模式
来源:互联网 发布:电子小报软件 编辑:程序博客网 时间:2024/06/06 02:29
一、UML图
关键词:深复制,Clone。
二、概念
原型模式(Prototype):用原型示例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
三、说明
(1)原型模式实际上就是从一个对象再创建另外一个可定制的对象,而且不需要知道任何创建的细节。
(2)一般在初始化的信息不发生变化的情况下,克隆是最好的办法。这既隐藏了对象创建的细节,有对性能是大大的提高。因为如果不用Clone,每次new,都需要执行一次构造函数,如果构造函数的执行时间很长,那么多次的执行这个初始化操作就实在是太低效了。
(3)浅复制和深复制:
浅复制:被复制的对象的所有变量都含有与原来的对象相同的值,而所有对其他对象的引用都仍然指向原来的对象。
深复制:把引用对象的变量指向复制过的新对象,而不是原有的被引用的对象。
Clone的时候使用深复制。
四、C++实现
(1)Prototype.h
#ifndef PROTOTYPE_H#define PROTOTYPE_H#include <iostream>#include <string>//工作经验类:WorkExperience类class WorkExperience{private:std::string workDate;std::string company;public:WorkExperience(){}~WorkExperience(){}//供克隆调用的构造函数WorkExperience(WorkExperience* work){this->workDate=work->workDate;this->company=work->company;}std::string getWorkDate(){return workDate;}void setWorkDate(std::string workDate){this->workDate=workDate;}std::string getCompany(){return company;}void setCompany(std::string company){this->company=company;}//克隆WorkExperience* Clone(){//调用供克隆调用的构造函数WorkExperience(WorkExperience)return new WorkExperience(this);}};//原型类,声明一个克隆自身的接口。class Prototype{protected:std::string name;std::string sex;std::string age;std::string timeArea;std::string company;public:virtual void SetPersonalInfo(std::string sex,std::string age)=0;virtual void Display()=0;virtual Prototype* Clone()=0;};//具体原型类,即ConcretePrototype类,本例中为简历Resume类,实现一个克隆自身的操作。class Resume:public Prototype{private:WorkExperience* work;public:Resume(std::string name){this->name=name;work=new WorkExperience();}~Resume(){if(work!=NULL)delete work;}//供克隆调用的构造函数Resume(WorkExperience* work){this->work=work->Clone();}void SetPersonalInfo(std::string sex,std::string age){this->sex=sex;this->age=age;}void SetWorkExperience(std::string workDate,std::string company){work->setWorkDate(workDate);work->setCompany(company);}void Display(){std::cout<<name<<" "<<sex<<" "<<age<<std::endl;std::cout<<"工作经历 "<<work->getWorkDate()<<" "<<work->getCompany()<<std::endl;}//克隆Resume* Clone(){//调用 供克隆函数调用的构造函数Resume(work)Resume *cloneResume=new Resume(work);cloneResume->name=this->name;cloneResume->age=this->age;cloneResume->sex=this->sex;return cloneResume;}};#endif
(2)main.cpp
#include "Prototype.h"#include <iostream>#include <stdlib.h>void main(){Resume* a=new Resume("大鸟");a->SetPersonalInfo("男","29");a->SetWorkExperience("1998-2000","XX公司");Resume* b=a->Clone();b->SetWorkExperience("1998-2006","YY公司");Resume* c=b->Clone();c->SetPersonalInfo("男","24");c->SetWorkExperience("1998-2003","ZZ公司");a->Display();b->Display();c->Display();delete a;delete b;delete c;a=b=c=NULL;system("pause");}
0 0
- 大话设计模式C++实现-第9章-原型模式
- 大话设计模式c++实现--原型模式
- 《大话设计模式》之--第9章 简历复印----原型模式
- 《大话设计模式》之--第9章 简历复印----原型模式
- 大话设计模式--原型模式
- 大话设计模式-原型模式
- 大话设计模式-原型模式
- 大话设计模式-原型模式
- 大话设计模式----原型模式
- 大话设计模式C++实现-第16章-状态模式
- 大话设计模式C++实现-第2章-策略模式
- 大话设计模式C++实现-第6章-装饰模式
- 大话设计模式C++实现-第7章-代理模式
- 大话设计模式C++实现-第12章-外观模式
- 大话设计模式C++实现-第14章-观察者模式
- 大话设计模式C++实现-第17章-适配器模式
- 大话设计模式C++实现-第18章-备忘录模式
- 大话设计模式C++实现-第19章-组合模式
- Oracle11gR2——RMAN备份完整实施
- UVA - 12063(关于倍数的dp转化成模运算)
- 日经社説 20141217 政府の役割は賃上げできる環境づくりだ
- 青年歌手大奖赛_评委会打分
- MyEclipse反编译Class文件的实现
- 大话设计模式C++实现-第9章-原型模式
- oracle 10g dataguard修改保护模式遭遇ORA-03113
- GPIO 設置
- 关于javascript中的函数作用域
- 读取硬盘下多少行Java代码
- 【LeetCode】Reverse Nodes in k-Group 解题报告
- 条款 14: 确定基类有虚析构函数
- ext3文件系统反删除利器ext3grep应用实战
- jQuery页面加载初始化的3种方法