一、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");
}
原文地址:http://blog.csdn.net/xiqingnian/article/details/41983337