大话设计模式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
原创粉丝点击