定义
用原型实例来指定创建对象的种类,通过拷贝原型来创建新的对象。
案例
比如,在设计纸币的时候,最初的设计图就是一个原型,以后在造纸币的时候,就不用再设计了,根据之前设计好的纸币直接复印就可以了。现在有一个抽象类Money,它是所有纸币的一个基类,带有一个复制功能clone(), 人民币Renminbi和Dollar都是从它继承而来。
钱对与我们来说都一样,只要能复制就可以了,应为是通过复制,所以我们要在赋值构造的时候注意深拷贝和浅拷贝的问题,clone()而来的对象和原型对象是不同的对象,不能引用相同的数据。
class Money {
public:
virtual Money* clone() const = 0;
}
class Renminbi : public Money {
public:
Renminbi(const Renminbi& other) {
m_amount = other.m_amount;
}
Money* clone() const {
return new Door(*this);
}
private:
int m_amount;
}
Money* rmb = new Renminbi();
Pocket pocket;
pocket.push(rmb);
pocket.push(rmb.clone());
pocket.push(rmb.clone());
pocket.push(rmb.clone());
...
这样就不用担心很快就花完了。
适用性
- 当一个对象在运行是才能确定,经过一些列的操作。
- 当要保存一个对象在运行过程中的不同时刻的信息。
- 当要创建一系列相同的对象。
相关模式
一搬原型模式不单独使用,是和其他的模式一起组合使用。