原型模式就是在类中定义一个克隆(拷贝)函数,在对象调用时可以返回该对象的一个拷贝。
第一眼看到它的定义的时候感觉没啥用,不就是拷贝构造吗?无非是将它封装了一下。然后仔细一想,如果对象中拥有较多的状态成员变量,你拷贝(赋值)构造的时候不适合都写在里面,在外面赋值更是有点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;
}
如有疑问或者发现错误,欢迎下面评论,咱们共同探讨改正。