设计模式C++实现(5)——原型模式、模板方法模式

       软件领域中的设计模式为开发人员提供了一种使用专家设计经验的有效途径。设计模式中运用了面向对象编程语言的重要特性:封装、继承、多态,真正领悟设计模式的精髓是可能一个漫长的过程,需要大量实践经验的积累。最近看设计模式的书,对于每个模式,用C++写了个小例子,加深一下理解。主要参考《大话设计模式》和《设计模式:可复用面向对象软件的基础》(DP)两本书。本文介绍原型模式和模板方法模式的实现。首先介绍原型模式,然后引出模板方法模式。

       DP书上的定义为:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。其中有一个词很重要,那就是拷贝。可以说,拷贝是原型模式的精髓所在。举个现实中的例子来介绍原型模式。找工作的时候,我们需要准备简历。假设没有打印设备,因此需手写简历,这些简历的内容都是一样的。这样有个缺陷,如果要修改简历中的某项,那么所有已写好的简历都要修改,工作量很大。随着科技的进步,出现了打印设备。我们只需手写一份,然后利用打印设备复印多份即可。如果要修改简历中的某项,那么修改原始的版本就可以了,然后再复印。原始的那份手写稿相当于是一个原型,有了它,就可以通过复印(拷贝)创造出更多的新简历。这就是原型模式的基本思想。下面给出原型模式的UML图,以刚才那个例子为实例。

设计模式C++实现(5)——原型模式、模板方法模式

  1. //父类  
  2. class Resume  
  3. {  
  4. protected:  
  5.     char *name;  
  6. public:  
  7.     Resume() {}  
  8.     virtual ~Resume() {}  
  9.     virtual Resume* Clone() { return NULL; }  
  10.     virtual void Set(char *n) {}  
  11.     virtual void Show() {}  
  12. };  

[cpp]  view plain  copy  print

  1. class ResumeA : public Resume  
  2. {  
  3. public:  
  4.     ResumeA(const char *str);  //构造函数  
  5.     ResumeA(const ResumeA &r); //拷贝构造函数  
  6.     ~ResumeA();                //析构函数  
  7.     ResumeA* Clone();          //克隆,关键所在  
  8.     void Show();               //显示内容  
  9. };  
  10. ResumeA::ResumeA(const char *str)   
  11. {  
  12.     if(str == NULL) {  
  13.         name = new char[1];   
  14.         name[0] = ‘ ’;   
  15.     }  
  16.     else {  
  17.         name = new char[strlen(str)+1];  
  18.         strcpy(name, str);  
  19.     }  
  20. }  
  21. ResumeA::~ResumeA() { delete [] name;}  
  22. ResumeA::ResumeA(const ResumeA &r) {  
  23.     name = new char[strle

    来源:箭已离弓

    声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2016年11月1日
下一篇 2016年11月1日

相关推荐