大话设计模式(C++)第九章-原型模式

概念

原型模式(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.csdn.net/xiqingnian/article/details/41983337

猜你喜欢

转载自blog.csdn.net/Rage_/article/details/84568022
今日推荐