C++设计模式6--原型模式Prototype--原始对象的克隆

简介:

原型模式概述

用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。

Prototype原型模式是一种创建型设计模式,Prototype模式允许一个对象再创建另外一个可定制的对象,根本无需知道任何如何创建的细节,工作原理是:通过将一个原型对象传给那个要发动创建的对象,这个要发动创建的对象通过请求原型对象拷贝它们自己来实施创建。

组成模型

客户(Client)角色:客户类提出创建对象的请求。
抽象原型(Prototype)角色:这是一个抽象角色,通常由一个C#接口或抽象类实现。此角色给出所有的具体原型类所需的接口。在C#中,抽象原型角色通常实现了ICloneable接口。
具体原型(Concrete Prototype)角色:被复制的对象。此角色需要实现抽象原型角色所要求的接口。



应对问题

它主要面对的问题是:“某些结构复杂的对象”的创建工作;由于需求的变化,这些对象经常面临着剧烈的变化,但是他们却拥有比较稳定一致的接口。



  1. #include <iostream>  
  2. #include <cstring>  
  3.   
  4.   
  5.   
  6. /// 原型抽象类 -=> 对应于抽象原型(Prototype)角色  
  7. class Prototype  
  8. {  
  9. public :  
  10.     Prototype( ){  };  
  11.   
  12.     virtual ~Prototype( ){ };  
  13.   
  14.     virtual Prototype* Clone( ) const = 0;  // 拷贝函数,原型模式的精髓所在  
  15.   
  16.     virtual void Show( ) const = 0;                // 显示当前信息  
  17. };  
  18.   
  19.   
  20.   
  21.   
  22.   
  23. /// 原型类A -=> 对应于具体原型(Concrete Prototype)角色:  
  24. class PrototypeA : public Prototype  
  25. {  
  26. public :  
  27.     PrototypeA(const char *name = NULL)           // 构造函数  
  28.     {  
  29.         if(name == NULL)  
  30.         {  
  31.             this->m_name = new char[1];  
  32.             strcpy(this->m_name, "");  
  33.         }  
  34.         else  
  35.         {  
  36.             this->m_name = new char[strlen(name) + 1];  
  37.             strcpy(this->m_name, name);  
  38.         }  
  39.     }  
  40.   
  41.     PrototypeA(const PrototypeA &Prototype)               // 实现深拷贝  
  42.     {  
  43.         this->m_name = new char[strlen(Prototype.m_name)];  
  44.         strcpy(this->m_name, Prototype.m_name);  
  45.     }  
  46.   
  47.     virtual ~PrototypeA( )                 // 虚析构函数  
  48.     {  
  49.         delete[] this->m_name;  
  50.     }  
  51.   
  52.     Prototype* Clone( ) const  // 拷贝函数,原型模式的精髓所在  
  53.     {  
  54.         return new PrototypeA(*this);  
  55.     }  
  56.   
  57.     void Show( ) const                // 显示当前函数信息  
  58.     {  
  59.     std::cout <<"PrototypeA's name is " <<this->m_name <<std::endl;  
  60.     }  
  61. protected :  
  62.     char *m_name;  
  63. };  
  64.   
  65.   
  66. /// 原型类B -=> 对应于具体原型(Concrete Prototype)角色:  
  67. class PrototypeB : public Prototype  
  68. {  
  69. public :  
  70.     PrototypeB(int no)          // 构造函数  
  71.     {  
  72.         m_no = no;  
  73.     }  
  74.     PrototypeB(const PrototypeB &prototype)               //  
  75.     {  
  76.         this->m_no = prototype.m_no;  
  77.     }  
  78.   
  79.     virtual ~PrototypeB( )                // 虚析构函数  
  80.     {  
  81.   
  82.     }  
  83.     Prototype* Clone( ) const  // 拷贝函数,原型模式的精髓所在  
  84.     {  
  85.         return new PrototypeB(*this);  
  86.     }                      // 获取名字的函数  
  87.     void Show( ) const                // 显示当前函数信息  
  88.     {  
  89.         std::cout <<"PrototypeB's no is " <<this->m_no <<std::endl;  
  90.     }  
  91. protected :  
  92.     int     m_no;  
  93. };  
  94.   
  95.   
  96.   
  97.   
  98. int main()  
  99. {  
  100.     Prototype *r1 = new PrototypeA("A");  
  101.     Prototype *r2 = r1->Clone( );  
  102.   
  103.     // r1和r2是相同内容的副本  
  104.     r1->Show( );  
  105.     r2->Show( );  
  106.     delete r1;  
  107.     delete r2;  
  108.     r1 = r2 = NULL;  
  109.   
  110.     Prototype *r3 = new PrototypeB(10);  
  111.     Prototype *r4 = r3->Clone( );  
  112.     // r1和r2是用相同内容的拷贝  
  113.     r3->Show( );  
  114.     r4->Show( );  
  115.     delete r3;  
  116.     delete r4;  
  117.     r3 = r4 = NULL;  
  118.   
  119.     return 0;  
  120. }  


转载:http://blog.csdn.net/gatieme/article/details/18001813

目录
相关文章
|
13天前
|
设计模式 C++
C++一分钟之-设计模式:工厂模式与抽象工厂
【7月更文挑战第14天】设计模式是解决软件设计问题的通用方案。工厂模式与抽象工厂模式是创建型模式,用于对象创建而不暴露创建逻辑。工厂模式推迟实例化到子类,但过度使用会增加复杂性。抽象工厂则创建相关对象族,但过度抽象可能造成不必要的复杂度。两者均应按需使用,确保设计灵活性。代码示例展示了C++中如何实现这两种模式。
21 3
|
14天前
|
设计模式 安全 C++
C++一分钟之-C++中的设计模式:单例模式
【7月更文挑战第13天】单例模式确保类只有一个实例,提供全局访问。C++中的实现涉及线程安全和生命周期管理。基础实现使用静态成员,但在多线程环境下可能导致多个实例。为解决此问题,采用双重检查锁定和`std::mutex`保证安全。使用`std::unique_ptr`管理生命周期,防止析构异常和内存泄漏。理解和正确应用单例模式能提升软件的效率与可维护性。
16 2
|
15天前
|
存储 编译器 C语言
【C++基础 】类和对象(上)
【C++基础 】类和对象(上)
|
25天前
|
设计模式 JavaScript
js设计模式【详解】—— 原型模式
js设计模式【详解】—— 原型模式
24 6
|
24天前
|
数据安全/隐私保护 C++
|
23天前
|
编译器 C++
【C++】类和对象⑤(static成员 | 友元 | 内部类 | 匿名对象)
📚 C++ 知识点概览:探索类的`static`成员、友元及应用🔍。
|
24天前
|
算法 C++ 容器
|
24天前
|
存储 安全 编译器
|
28天前
|
存储 编译器 C++
【C++】类和对象④(再谈构造函数:初始化列表,隐式类型转换,缺省值
C++中的隐式类型转换在变量赋值和函数调用中常见,如`double`转`int`。取引用时,须用`const`以防修改临时变量,如`const int& b = a;`。类可以有隐式单参构造,使`A aa2 = 1;`合法,但`explicit`关键字可阻止这种转换。C++11起,成员变量可设默认值,如`int _b1 = 1;`。博客探讨构造函数、初始化列表及编译器优化,关注更多C++特性。
|
3天前
|
C++
什么是析构函数,它在C++类中起什么作用
什么是析构函数,它在C++类中起什么作用?
20 11