应用场景
原型模式是一种创建型设计模式,Prototype模式允许一个对象再创建另外一个可定制的对象,根本无需知道任何如何创建的细节。
工作原理是:通过将一个原型对象传给那个要发动创建的对象,这个要发动创建的对象通过请求原型对象拷贝它们自己来实施创建。
具体可能适用的场景:
- 当创建一个对象时,其初始化可能会面临复杂的创建过程,我们可以通过稳定一致的接口创建对象;
- 当系统针对某对象可能存在多个分支,其分支中存在对数据的修改。当分支完成后,需要创建相同的一个被修改对象,使用该模式可以屏蔽源对象被修改而造成的创建复杂性,并且能够将修改后的对象完整拷贝过来。
ps:此处纯属个人理解,如有错误欢迎指正。
优缺点
优点:
- 原型模式允许动态的增加或减少产品类,产品类不需要非得有任何事先确定的等级结构;
- 屏蔽了对象创建的细节,用户只需要调用固定的接口即可。
缺点:
- 每个类中都需要实现相同的clone接口。其中,要明确判断是否需要进行深拷贝和浅拷贝的问题。一般情况下,需要进行深拷贝来生成一个与原始对象互不干扰的对象。
实例(C++)
#include <iostream>
#include <string>
using namespace std;
class ICloneable {
public:
//创建接口类
virtual ICloneable *clone() = 0;
};
class Resume: public ICloneable
{
private:
string name, sex, age, timeArea, company;
public:
Resume(string s)
{
name = s;
}
void setPersonalInfo(string s, string a)
{
sex = s;
age = a;
}
void setWorkExperience(string t, string c)
{
timeArea = t;
company = c;
}
void display()
{
cout << name << " " << sex << " " << age << endl;
cout << "工作经历: " << timeArea << " " << company << endl << endl;
}
Resume *clone()
{
Resume *b;
b = new Resume(name);
b->setPersonalInfo(sex, age);
b->setWorkExperience(timeArea, company);
return b;
}
};
int main()
{
Resume *r = new Resume("李宏");
r->setPersonalInfo("男", "30");
r->setWorkExperience("2007-2010", "读研究生");
r->display();
Resume *r2 = r->clone();
r2->setWorkExperience("2003-2007", "读本科");
r->display();
r2->display();
cin.get();
return 0;
}