c++设计模式--原型模式

// 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");
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值