c++设计模式之原型模式 学习笔记

原型模式就是在类中定义一个克隆(拷贝)函数,在对象调用时可以返回该对象的一个拷贝。
第一眼看到它的定义的时候感觉没啥用,不就是拷贝构造吗?无非是将它封装了一下。然后仔细一想,如果对象中拥有较多的状态成员变量,你拷贝(赋值)构造的时候不适合都写在里面,在外面赋值更是有点low,所以不如将其封装起来。——当然应该还有其它的作用,不过本人初学,也说不上来。但既然理解了它的思想,以后用的时候再见招拆招吧。
举个网上比较常见的例子:比如简历类吧。你的简历中有你的名字,年龄,联系方式,工作经历等等… …然后咱们定义一个克隆函数,可以返回你的简历对象的原型。
直接上代码:

#include<iostream>

using namespace std;

//工作经历
class Experience  
{
public:
	Experience(string name, int salary, int workYears)
	{
		m_company = name;
		m_salary = salary;
		m_workYears = workYears;
	}
	Experience(Experience* experience)
	{
		if (experience != NULL)
		{
			m_company = experience->m_company;
			m_salary = experience->m_salary;
			m_workYears = experience->m_workYears;
		}
	}
public:
	void setCompany(string name)
	{
		m_company = name;
	}
	void setSalary(int salary)
	{
		m_salary = salary;
	}
	void setWorkYears(int workYears)
	{
		m_workYears = workYears;
	}
	string getCompany()
	{
		return m_company;
	}
	int getSalary()
	{
		return m_salary;
	}
	int getWorkYears()
	{
		return m_workYears;
	}
private:
	string m_company;  //公司名
	int m_salary;  //年薪
	int  m_workYears; //工作年限
};

//简历原型
class ResumeProtoType   
{
protected:
	Experience * m_experience; //工作经历
public:
	string m_name; //姓名
	int m_age; //年龄
	string m_sex; //性别
	string m_school; //毕业院校
public:
	ResumeProtoType():m_experience(NULL)
	{
		cout << "父类构造" << endl;
	}
	virtual ~ResumeProtoType()  //虚析构
	{
		cout << "父类析构" << endl;
	}
	void showToHR()
	{
		cout << "将简历交给HR" << endl;
	}
	void setExperience(Experience * experience)
	{

		m_experience = new Experience(experience);
	}

	virtual void setWorkExperience(Experience* experience) = 0;
	virtual void setPersonalInformation(string name, int age, string sex, string school) = 0;
	virtual ResumeProtoType* clone() = 0;
};

//实际的简历
class ConcreateResume :public ResumeProtoType
{
public:
	ConcreateResume()
	{
		cout << "子类构造" << endl;
	}
	~ConcreateResume()
	{
		if (this->m_experience = NULL)
			delete this->m_experience;
		m_experience = NULL;
		cout << "子类析构" << endl;
	}
	void setWorkExperience(Experience* experience)
	{
		this->m_experience = experience;
	}
	void setPersonalInformation(string name, int age, string sex, string school)
	{
		this->m_age = age;
		this->m_name = name;
		this->m_sex = sex;
		this->m_school = school;
	}
	ResumeProtoType* clone()
	{
		ResumeProtoType* resume = new ConcreateResume();
		resume->m_age = this->m_age;
		resume->m_name = this->m_name;
		resume->m_sex = this->m_sex;
		resume->m_school = this->m_school;
		resume->setExperience(this->m_experience);
		return resume;
	}
};

void main()
{
	Experience* my_experience = new Experience("百度", 100000000, 5);
	ResumeProtoType *my_resume = new ConcreateResume;
	my_resume->setPersonalInformation("小明", 30, "boy", "QingHua");
	my_resume->setWorkExperience(my_experience);
	my_resume->showToHR();  //这个函数没写

	ResumeProtoType *my_resume2 = my_resume->clone();
	my_resume2->showToHR();
	system("pause");
	return;
}

如有疑问或者发现错误,欢迎下面评论,咱们共同探讨改正。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值