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

原型模式概述

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

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

组成模型

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

应对问题

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

[cpp] view plain copy print?

  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

时间: 2024-09-19 20:42:33

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

浅谈Java设计模式关于原型模式(Prototype)思索建议

java教程:关于Java设计模式关于原型模式(Prototype) IT信息技术http://www.52ij.com/jishu/ 首先需要弄清楚什么叫原型模式,或者说为什么要有原型模式,运用它会给我们带来什么或能解决什么问题?原型模式(Prototype)同抽象工厂模式同属于创建型模式,它主要关注于大量相同或相似对象的创建问题,应用原型模式就是先需要一个原对象,然后通过对原对象进行复制(克隆),来产生一个与原对象相同或相似的新对象.注意这里所说的对象相同不是指复制出来的副本对象与原对象是同

乐在其中设计模式(C#) - 原型模式(Prototype Pattern)

原文:乐在其中设计模式(C#) - 原型模式(Prototype Pattern)[索引页][源码下载] 乐在其中设计模式(C#) - 原型模式(Prototype Pattern) 作者:webabcd 介绍 用原型实例指定创建对象的种类,并且通过拷贝这个原型来创建新的对象. 示例 有一个Message实体类,现在要克隆它. MessageModel using System;using System.Collections.Generic;using System.Text;namespac

温故而知新:设计模式之原型模式(Prototype)

原型模式个人以为最适合的场景:参照现有的某一个对象实例,快速得到多个完整的实例副本.(通常是深拷贝的副本) 深拷贝在c#中实现的最简单方式莫过于通过反序列化得到一个全新的对象实例.(当然如果浅拷贝的话,方法就很多了,比如利用MemberwiseClone或反射属性自动赋值都可以) 场景:还是游戏场景,就拿三国来说吧,打仗时可能需要小兵若干,每个小兵可能还要骑马...(简单起见其它东东就不提了,比如可能每个小兵还要带兵器若干),这些个实例的数量是动态的, 但是几乎每个小兵的属性都完全相同,每匹战马

设计模式(四)原型模式Prototype(创建型)

设计模式(四)原型模式Prototype  1.   概述 我们都知道,创建型模式一般是用来创建一个新的对象,然后我们使用这个对象完成一些对象的操作,我们通过原型模式可以快速的创建一个对象而不需要提供专门的new()操作就可以快速完成对象的创建,这无疑是一种非常有效的方式,快速的创建一个新的对象. 例子1:孙悟空拔下一嘬猴毛,轻轻一吹就会变出好多的孙悟空来. 例子2:寄个快递下面是一个邮寄快递的场景:"给我寄个快递."顾客说."寄往什么地方?寄给--?"你问.&qu

C#设计模式(6)——原型模式(Prototype Pattern)

原文:C#设计模式(6)--原型模式(Prototype Pattern) 一.引言 在软件系统中,当创建一个类的实例的过程很昂贵或很复杂,并且我们需要创建多个这样类的实例时,如果我们用new操作符去创建这样的类实例,这未免会增加创建类的复杂度和耗费更多的内存空间,因为这样在内存中分配了多个一样的类实例对象,然后如果采用工厂模式来创建这样的系统的话,随着产品类的不断增加,导致子类的数量不断增多,反而增加了系统复杂程度,所以在这里使用工厂模式来封装类创建过程并不合适,然而原型模式可以很好地解决这个

.Net设计模式实例之原型模式( Prototype Pattern)

一.原型模式简介(Brief Introduction) 原型模式(Prototype Pattern):用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象. Specify the kind of objects to create using a prototypical instance, and create new objects by copying this prototype. 浅复制与深复制区别: 浅复制,被复制的所有变量都还有与原来对象相同的值,而所有的对其他对象的

设计模式之八(原型模式)

原文:设计模式之八(原型模式) 前言 原型模式:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. 结构图 Prototype,原型类,声明一个克隆自身的接口 ConcretePrototype1,ConcretePrototype2具体原型类,实现一个克隆自身的操作 Client,调用,让一个原型克隆自身从而创建一个新的对象 其实原型模式就是从一个对象再创建另外一个可定制的对象,而且不需知道任何创建的细节. 代码实现  Prototype原型类设计代码 public abstra

设计模式 ( 十三 ) 命令模式Command(对象行为型)

设计模式 ( 十三 ) 命令模式Command(对象行为型) 1.概述         在软件设计中,我们经常需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是哪个,我们只需在程序运行时指定具体的请求接收者即可,此时,可以使用命令模式来进行设计,使得请求发送者与请求接收者消除彼此之间的耦合,让对象之间的调用关系更加灵活.  例子1:电视机遥控器 : 遥控器是请求的发送者,电视机是请求的接收者,遥控器上有一些按钮如开,关,换频道等按钮就是具体命令,不同的按钮对应电视机的不

设计模式 ( 十七) 状态模式State(对象行为型)

设计模式 ( 十七) 状态模式State(对象行为型) 1.概述 在软件开发过程中,应用程序可能会根据不同的情况作出不同的处理.最直接的解决方案是将这些所有可能发生的情况全都考虑到.然后使用if... ellse语句来做状态判断来进行不同情况的处理.但是对复杂状态的判断就显得"力不从心了".随着增加新的状态或者修改一个状体(if else(或switch case)语句的增多或者修改)可能会引起很大的修改,而程序的可读性,扩展性也会变得很弱.维护也会很麻烦.那么我就考虑只修改自身状态的

设计模式:原型模式(Prototype)

 原型模式:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象.  举个例子: 1 原型(实际上是implements了Cloneable接口,进而重写clone()方法) public class ProtoType implements Cloneable { private String name; @Override public ProtoType clone() { try { return (ProtoType)super.clone(); } catch (Clone