// ProtoTypePattern.cpp : 定义控制台应用程序的入口点。
//通过此例程了解设计模式里的“原型模式”,
//具体信息参考《大话设计模式》
#include "stdafx.h"
#include <stdlib.h>
#include <iostream>
using namespace std;
//父类:简历
class Resume
{
protected:
char *m_name;
public:
Resume()
{
}
virtual ~Resume()
{
}
virtual Resume* Clone()
{
return NULL;
}
virtual void Set(char *name)
{
}
virtual const void Show() const
{
}
};
class ResumeA : public Resume
{
public:
ResumeA(const char *str);
ResumeA(const ResumeA &r); //自定义拷贝构造函数,深拷贝
~ResumeA();
ResumeA* Clone(); //克隆,内部调用拷贝构造函数
const void Show() const; //显示简历信息
};
ResumeA::ResumeA(const char *str)
{
if(str == NULL) {
m_name = new char[1];
m_name[0] = '\0';
}
else {
m_name = new char[strlen(str)+1];
strcpy(m_name, str);
}
}
ResumeA::~ResumeA()
{
delete [] m_name;
}
ResumeA::ResumeA(const ResumeA &r)
{
m_name = new char[strlen(r.m_name)+1];
strcpy(m_name, r.m_name);
}
ResumeA* ResumeA::Clone()
{
return new ResumeA(*this);
}
const void ResumeA::Show() const
{
cout<<"天策的简历--》"<<m_name<<endl;
}
class ResumeB : public Resume
{
public:
ResumeB(const char *str);
ResumeB(const ResumeB &r);
~ResumeB();
ResumeB* Clone();
const void Show() const;
};
ResumeB::ResumeB(const char *str)
{
//下面这段代码引自《effective c++》
if(str == NULL) {
m_name = new char[1];
m_name[0] = '\0';
}
else {
m_name = new char[strlen(str)+1];
strcpy(m_name, str);
}
}
ResumeB::~ResumeB()
{
delete [] m_name;
}
ResumeB::ResumeB(const ResumeB &r)
{
m_name = new char[strlen(r.m_name)+1];
strcpy(m_name, r.m_name);
}
ResumeB* ResumeB::Clone()
{
return new ResumeB(*this);
}
const void ResumeB::Show() const
{
cout<<"张三丰的简历--》"<<m_name<<endl;
}
int main()
{
Resume *r1 = new ResumeA("Resume A");
Resume *r2 = new ResumeB("Resume B");
Resume *r3 = r1->Clone();
Resume *r4 = r2->Clone();
r1->Show();
r2->Show();
delete r1;
delete r2;
r1 = r2 = NULL;
//深拷贝所以对r3,r4无影响,如果调用默认的拷贝构造函数,则是浅拷贝
r3->Show();
r4->Show();
delete r3;
delete r4;
r3 = r4 = NULL;
system("pause");
}