原型模式

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函数内部还是调用了复制构造函数,这样效率还有提升吗?