设计模式-原型模式

1. 原型模式

  1. 如果你想从A的实例中得到一份与A内容相同的实例,并且这两个实例互不干扰,并且实例A是运行时的状态,就需要使用原型模式;
  2. 原型模式与拷贝构造函数是不相同的。拷贝构造函数涉及的类是已知的, 原型模式通过指针调用clone()函数, 其涉及的类型是未知的;
  3. 原型模式与直接new 出实例是不同的。用new新建对象不能获取对象当前运行时的状态。并且某些情况下,直接new新对象效率低;
  4. 如果是需要一个干净的空对象时候,建议选用工厂模式或是抽象工厂模式;
    代码如下,让一个类继承带有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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值