现在的位置: 首页 > 综合 > 正文

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

2013年07月09日 ⁄ 综合 ⁄ 共 1825字 ⁄ 字号 评论关闭

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

抱歉!评论已关闭.