概念
原型模式(Prototype):用原型示例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
它主要面对的问题是:“某些结构复杂的对象”的创建工作;由于需求的变化,这些对象经常面临着剧烈的变化,但是他们却拥有比较稳定一致的接口。
三、说明
(1)原型模式实际上就是从一个对象再创建另外一个可定制的对象,而且不需要知道任何创建的细节。
(2)一般在初始化的信息不发生变化的情况下,克隆是最好的办法。这既隐藏了对象创建的细节,有对性能是大大的提高。因为如果不用Clone,每次new,都需要执行一次构造函数,如果构造函数的执行时间很长,那么多次的执行这个初始化操作就实在是太低效了。
(3)浅复制和深复制:
浅复制:被复制的对象的所有变量都含有与原来的对象相同的值,而所有对其他对象的引用都仍然指向原来的对象。
深复制:把引用对象的变量指向复制过的新对象,而不是原有的被引用的对象。
Clone的时候使用深复制。
#include<iostream>
#include<string>
using namespace std;
//工作经验类
class WorkExperience
{
private:
string workDate;
string company;
public:
WorkExperience(){}
~WorkExperience(){}
//提供克隆调用的构造函数
WorkExperience(WorkExperience *work)
{
this->workDate = work->workDate;
this->company = work->company;
}
string getWorkDate()
{
return workDate;
}
void setWorkDate(string workDate)
{
this->workDate = workDate;
}
string getCompany()
{
return company;
}
void setCompany(string company)
{
this->company = company;
}
//克隆
WorkExperience *Clone()
{
//调用供克隆调用的构造函数WorkExperience(WorkExperience)
return new WorkExperience(this);
}
};
//原型类,声明一个克隆自身的接口
class Prototype
{
protected:
string name;
string sex;
string age;
string timeArea;
string company;
public:
virtual void SetPersonalInfo(string sex, string age) = 0;
virtual void Display() = 0;
virtual Prototype *Clone() = 0;
};
//具体原型类,即ConcretePrototype类,本例中为简历Resume类,实现一个克隆自身的操作。
class Resume :public Prototype
{
private:
WorkExperience *work;
public:
Resume(string name)
{
this->name = name;
work = new WorkExperience();
}
~Resume()
{
if (work != nullptr)
delete work;
}
//供克隆调用的构造函数
Resume(WorkExperience *work)
{
this->work = work->Clone();
}
void SetPersonalInfo(string sex, string age)
{
this->sex = sex;
this->age = age;
}
void SetWorkExperience(string workDate, string company)
{
work->setWorkDate(workDate);
work->setCompany(company);
}
void Display()
{
cout << name << " " << sex << " " << age << endl;
cout << "工作经历 " << work->getWorkDate() << " " << work->getCompany() << endl;
}
Resume *Clone()
{
//调用 供克隆函数调用的构造函数Resume(work)
Resume *cloneResume = new Resume(work);
cloneResume->name = this->name;
cloneResume->age = this->age;
cloneResume->sex = this->sex;
return cloneResume;
}
};
int 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 = nullptr;
return 0;
}
原文链接:https://blog.youkuaiyun.com/xiqingnian/article/details/41983337