原型模式
1 核心思想
原型模式,用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
原型模式就是从一个对象再创建另外一个可定制的对象,而且不需要知道任何创建的细节。
一般在初始化的信息不发生变化的情况下,克隆是最好的办法,这样既隐藏了对象创建的细节,又对性能是大大的提高。性能提高主要表现在使用克隆就不再需要执行构造函数,可以有效提示执行效率。
深拷贝 vs. 浅拷贝:
若原型类中包含自定义对象,则需要对该对象进行深拷贝。
2 深拷贝的原型模式具体实现
//Prototype.h
class Prototype
{
public:
Prototype() {
}
virtual ~Prototype() {
}
virtual Prototype* Clone() =0;
};
//Resume.h
#include <iostream>
#include "Prototype.h"
#include "WorkExperience.h"
class Resume : public Prototype
{
public:
Resume();
virtual ~Resume();
WorkExperience *m_WorkExperience;
Resume(WorkExperience* work);
Resume(std::string name);
virtual Resume* Clone();
void Display();
int GetAge();
std::string GetName();
std::string GetSex();
void SetAge(int age);
void SetName(std::string name);
void SetPersonalInfo(std::string sex, int age);
void SetSex(std::string sex);
void SetWorkExperience(std::string workdate, std::string company);
private:
int m_strAge;
std::string m_strName;
std::string m_strSex;
};
//WorkExperience.h
#include <string>
class WorkExperience
{
public:
WorkExperience();
WorkExperience(WorkExperience* work);
virtual ~WorkExperience();
WorkExperience* Clone();
std::string GetCompany();
std::string GetWorkdate();
void SetCompany(std::string company);
void SetWorkdate(std::string workdate);
private:
std::string m_company;
std::string m_strDate;
};
//Resume.cpp
#include "Resume.h"
Resume::Resume(){
}
Resume::~Resume(){
if (m_WorkExperience)
{
delete m_WorkExperience;
m_WorkExperience = nullptr;
}
}
Resume::Resume(WorkExperience* work){
m_WorkExperience = work->Clone();
}
Resume::Resume(std::string name){
m_strName = name;
m_WorkExperience = new WorkExperience;
}
Resume* Resume::Clone(){
Resume* cloneResume = new Resume(m_WorkExperience);
cloneResume->m_strAge = m_strAge;
cloneResume->m_strName = m_strName;
cloneResume->m_strSex = m_strSex;
return cloneResume;
}
void Resume::Display(){
std::cout << m_strName << " " << m_strSex << " " << m_strAge << std::endl;
std::cout << "工作经历 " << m_WorkExperience->GetWorkdate() << " " << m_WorkExperience->GetCompany() << std::endl;
}
int Resume::GetAge(){
return m_strAge;
}
std::string Resume::GetName(){
return m_strName;
}
std::string Resume::GetSex(){
return m_strSex;
}
void Resume::SetAge(int age){
m_strAge = age;
}
void Resume::SetName(std::string name){
m_strName = name;
}
void Resume::SetPersonalInfo(std::string sex, int age){
m_strAge = age;
m_strSex = sex;
}
void Resume::SetSex(std::string sex){
m_strSex = sex;
}
void Resume::SetWorkExperience(std::string workdate, std::string company){
m_WorkExperience->SetWorkdate(workdate);
m_WorkExperience->SetCompany(company);
}
//WorkExperience.cpp
#include "WorkExperience.h"
WorkExperience::WorkExperience(){
}
WorkExperience::WorkExperience(WorkExperience* work)
{
this->m_company = work->m_company;
this->m_strDate = work->m_strDate;
}
WorkExperience::~WorkExperience(){
}
WorkExperience* WorkExperience::Clone(){
return new WorkExperience(this);
}
std::string WorkExperience::GetCompany(){
return m_company;
}
std::string WorkExperience::GetWorkdate(){
return m_strDate;
}
void WorkExperience::SetCompany(std::string company){
m_company = company;
}
void WorkExperience::SetWorkdate(std::string workdate){
m_strDate = workdate;
}
//main.cpp
#include "Prototype.h"
#include "Resume.h"
int main()
{
Resume* first = new Resume("大鸟");
first->SetPersonalInfo("男",29);
first->SetWorkExperience("1998 - 2000","xx公司");
Resume* second = first->Clone();
second->SetWorkExperience("1998-2006","YY公司");
Resume* third = second->Clone();
third->SetPersonalInfo("男",25);
third->SetWorkExperience("1998-2003","ZZ公司");
first->Display();
second->Display();
third->Display();
return 0;
}
ps:c++下的实现中,clone函数内部还是调用了复制构造函数,这样效率还有提升吗?