一、UML图
二、概念
原型模式(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() { 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.h
#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"); }
时间: 2024-11-05 14:43:05