原型模式:用原型实例指定创建对象的种类,并且通过拷贝原型创建新的对象。
本质:从一个对象再创建另一个可定制的对象,而不需要知道创建细节。
总结:对客户隐藏对象创建工作,原型模式是通过拷贝一个现有对象生成新对象的,达到了隔离类对象的使用者和具体类型(易变类)之间的耦合关系的迷路。
优点:快速构建相同类型对象,不需关心克隆对象本身类型。
浅复制:被复制对象的所有变量都含有与原来的对象相同的值,而所有其他对象的引用仍然指向原来的对象。
深复制:把引用对象的变量指向复制过的新对象,而不是原有的被引用的对象。
main.cpp
#include <iostream>
#include <stdlib.h>
#include "Resume.h"
#include "ResumeA.h"
#include "ResumeB.h"
using namespace std;
void process()
{
Resume* r1 = new ResumeA("A");
Resume* r2 = new ResumeB("B");
Resume* r3 = r1->clone();
Resume* r4 = r2->clone();
r1->show();
r1->fillResume();
r2->show();
r2->fillResume();
delete r1;
delete r2;
r1 = r2 = NULL;
r3->show();
r3->fillResume();
r4->show();
r4->fillResume();
delete r3;
delete r4;
r3 = r4 = NULL;
}
int main(int argc,char* argv[])
{
process();
system("pause");
return 0;
}
Resume.h
#ifndef RESUME_H
#define RESUME_H
#include <string>
class Resume
{
public:
Resume(void);
virtual ~Resume(void);
virtual Resume* clone();//克隆,关键所在
virtual void set(const std::string& sName);
virtual void show();
//填写简历
void fillResume();
protected:
//保护成员
virtual void setPersonalInfo();
virtual void setEducation();
virtual void setWorkExp();
protected:
std::string _sName;
};
#endif
Resume.cpp
#include "Resume.h"
#include <iostream>
Resume::Resume(void)
{
}
Resume::~Resume(void)
{
}
Resume* Resume::clone()
{
return NULL;
}
void Resume::set(const std::string& sName)
{
}
void Resume::show()
{
}
void Resume::fillResume()
{
setPersonalInfo();
setEducation();
setWorkExp();
}
void Resume::setPersonalInfo()
{
}
void Resume::setEducation()
{
}
void Resume::setWorkExp()
{
}
ResumeA.h
#ifndef RESUMEA_H
#define RESUMEA_H
#include "resume.h"
#include <string>
class ResumeA :
public Resume
{
public:
ResumeA(const std::string& sName);
ResumeA(const ResumeA& r);
~ResumeA(void);
ResumeA* clone();//克隆,关键所在
void show();
protected:
void setPersonalInfo();
void setEducation();
void setWorkExp();
};
#endif
ResumeA.cpp
#include "ResumeA.h"
#include <iostream>
using namespace std;
ResumeA::ResumeA(const std::string& sName)
{
_sName = sName;
}
//拷贝构造函数
ResumeA::ResumeA(const ResumeA& r)
{
_sName = r._sName;
}
ResumeA::~ResumeA(void)
{
_sName = "";
}
//注意可能内存泄露
ResumeA* ResumeA::clone()
{
return new ResumeA(*this);
}
void ResumeA::show()
{
cout << "简历:" << _sName << endl;
}
void ResumeA::setPersonalInfo()
{
cout << _sName << "的个人信息" << endl;
}
void ResumeA::setEducation()
{
cout << _sName << "的教育" << endl;
}
void ResumeA::setWorkExp()
{
cout << _sName << "的工作经验" << endl;
}
ResumeB.h
#ifndef RESUMEB_H
#define RESUMEB_H
#include "resume.h"
#include <string>
class ResumeB :
public Resume
{
public:
ResumeB(const std::string& sName);
ResumeB(const ResumeB& r);
~ResumeB(void);
ResumeB* clone();
void show();
protected:
void setPersonalInfo();
void setEducation();
void setWorkExp();
};
#endif
ResumeB.cpp
#include "ResumeB.h"
#include <iostream>
using namespace std;
ResumeB::ResumeB(const std::string& sName)
{
_sName = sName;
}
ResumeB::ResumeB(const ResumeB& r)
{
_sName = r._sName;
}
ResumeB::~ResumeB(void)
{
_sName = "";
}
ResumeB* ResumeB::clone()
{
return new ResumeB(*this);
}
void ResumeB::show()
{
cout << "简历:" << _sName << endl;
}
void ResumeB::setPersonalInfo()
{
cout << _sName << "的个人信息" << endl;
}
void ResumeB::setEducation()
{
cout << _sName << "的教育" << endl;
}
void ResumeB::setWorkExp()
{
cout << _sName << "的工作经验" << endl;
}