1. 原型模式
- 如果你想从A的实例中得到一份与A内容相同的实例,并且这两个实例互不干扰,并且实例A是运行时的状态,就需要使用原型模式;
- 原型模式与拷贝构造函数是不相同的。拷贝构造函数涉及的类是已知的, 原型模式通过指针调用clone()函数, 其涉及的类型是未知的;
- 原型模式与直接new 出实例是不同的。用new新建对象不能获取对象当前运行时的状态。并且某些情况下,直接new新对象效率低;
- 如果是需要一个干净的空对象时候,建议选用工厂模式或是抽象工厂模式;
代码如下,让一个类继承带有clone()的接口函数,就可以使用原型模式了:
class Work {
public:
Work(const string& t, int y) :title(t), year(y) {}
string title;
int year;
};
class Prototype {
public:
virtual Prototype *clone() = 0;
};
class Resume :public Prototype {
public:
Resume(const string& na, const string& ag, const Work& w)
:name(na), age(ag), work(w) {}
virtual Resume* clone() {
return new Resume(*this);
}
void setName(const string& str) {
name = str;
}
const string& getName() {
return name;
}
private:
string name;
string age;
Work work;
};
int main() {
Work w("software", 3);
Resume* r1 = new Resume("xiaocai", "21", w);
Resume *r2 = r1->clone();
r2->setName("daniao");
cout << r1->getName() << endl;
cout << r2->getName() << endl;
return 0;
}