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

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

2014年07月09日 ⁄ 综合 ⁄ 共 3910字 ⁄ 字号 评论关闭


其实个人觉得原型模式在C++也就那样吧。反正设计一个类,如果有需要都会重载=或者设置深拷贝函数。

自己创建自己的一份copy,给用户。

所以就简单写一下吧。

示意图,UML还是不太会

代码:

  1. #include "stdafx.h"  
  2.  #include <memory.h>  
  3.  #include <stdio.h>  
  4.  #include <string.h>  
  5.  #include <locale.h>  
  6.  #include <iostream>  
  7.    
  8.    
  9.    
  10.    
  11.  // 原型模式其实就是从一个对象再创建另外一个可定制的对象,而且不需要知道任何创建的细节  
  12.    
  13.    
  14.  // 问1:和deepCopy有什么区别?重载"="或者写一个DeepCopy函数就可以了嘛?  
  15.  // 问2:貌似没有最大限度的节省内存,要节省内存是不是要用享元模式?  
  16.  // 问3:C++里面可没有什么MemberwiseClone()  
  17.    
  18.    
  19.    
  20.  // 假设情景,某游戏,当用户新建角色时,会出现一个基础角色,  
  21.  // 然后用户再在此基础上对该基础角色进行修改  
  22.  // (其实应该是根据玩家的性别,身形选择,大致创建一个基础的角色外形,然后由玩家装扮,本处简化)  
  23.    
  24.  // char *纯粹是用于深拷贝  
  25.    
  26.  #define DELETE_OBJECT(p)   { if (p) delete p;  p = NULL; }  
  27.    
  28.  enum ESex  
  29.  {  
  30.     male,  
  31.     famale  
  32.  };  
  33.    
  34.  class IRole  
  35.  {  
  36.  public:  
  37.     virtual void Setproperty(ESex eSex, int nAge) = 0;  
  38.     virtual void SetDescription(char * pDescpt, int nLength) = 0;  
  39.     virtual void Show() = 0;  
  40.     virtual IRole* Clone() = 0;  
  41.     virtual void SetName(const std::string &strName) = 0;  
  42.    
  43.  protected:  
  44.     std::string m_strName;  
  45.     ESex        m_eSex;  
  46.     int         m_nAge;  
  47.     char*       m_pDescription;  
  48.     int         m_nDscriptLength;  
  49.    
  50.  };  
  51.    
  52.  class BaseRole : public IRole  
  53.  {  
  54.  public:  
  55.     BaseRole()  
  56.         //: m_eSex(male)  
  57.         //, m_nAge(25)  
  58.         //, m_pDescription(NULL)  
  59.     {  
  60.         m_eSex = male;  
  61.         m_nAge = 25;  
  62.         m_pDescription = NULL;  
  63.     }  
  64.     virtual ~BaseRole()  
  65.     {  
  66.         DELETE_OBJECT(m_pDescription);  
  67.     }  
  68.    
  69.     void SetName(const std::string &strName)  
  70.     {  
  71.         m_strName = strName;  
  72.     }  
  73.     void Setproperty(ESex eSex, int nAge)  
  74.     {  
  75.         m_eSex = eSex;  
  76.         m_nAge = nAge;  
  77.     }  
  78.     void SetDescription(char * pDescpt, int nLength)  
  79.     {  
  80.         m_nDscriptLength = nLength;  
  81.         m_pDescription = new char[nLength + 1];  
  82.         memset(m_pDescription, 0, nLength + 1);  
  83.         memcpy(m_pDescription, pDescpt, nLength);  
  84.     }  
  85.     void Show()  
  86.     {  
  87.         printf("\n\nNow Show A Role Information:\n");  
  88.         printf("Name:%s\n", m_strName.c_str());  
  89.         if (male == m_eSex)  
  90.         {  
  91.             printf("Sex: Male\n");  
  92.         }  
  93.         else  
  94.         {  
  95.             printf("Sex: FeMale\n");  
  96.         }  
  97.         printf("Age :%d\n", m_nAge);  
  98.         printf(m_pDescription);  
  99.         printf("\n");  
  100.     }  
  101.     IRole* Clone()  
  102.     {  
  103.         BaseRole * pRole = new BaseRole;  
  104.         pRole->m_eSex = m_eSex;  
  105.         pRole->m_nAge = m_nAge;  
  106.         pRole->m_strName = m_strName;  
  107.         pRole->m_nDscriptLength = m_nDscriptLength;  
  108.         pRole->m_pDescription = new char[m_nDscriptLength + 1];  
  109.         memset(pRole->m_pDescription, 0, m_nDscriptLength + 1);  
  110.         memcpy(pRole->m_pDescription, m_pDescription, m_nDscriptLength);  
  111.         return pRole;  
  112.     }     
  113.    
  114.  protected:  
  115.  private:  
  116.  };  
  117.    
  118.    
  119.  int _tmain(int argc, _TCHAR* argv[])  
  120.  {  
  121.    
  122.     //创建描述语句  
  123.     char *pChar = "So clever!";  
  124.     int nLength = strlen(pChar);  
  125.    
  126.     char *pChar_1 = "A Nice People!";  
  127.     int nLength_1 = strlen(pChar_1);  
  128.       
  129.     //创建BaseRole  
  130.     BaseRole *pBase = new BaseRole;  
  131.     pBase->Setproperty(male, 15);  
  132.     pBase->SetDescription(pChar, nLength);  
  133.     pBase->SetName("BaseRole");  
  134.    
  135.     //根据BaseRole创建其他  
  136.     BaseRole *pTom = (BaseRole*)pBase->Clone();  
  137.     pTom->SetDescription(pChar_1, nLength_1);  
  138.     pTom->SetName("Tom");  
  139.    
  140.     BaseRole *pLucy = dynamic_cast<BaseRole*>(pBase->Clone());  
  141.     pLucy->Setproperty(famale, 18);  
  142.     pLucy->SetName("Lucy");  
  143.    
  144.     pBase->Show();  
  145.     pTom->Show();  
  146.     pLucy->Show();  
  147.    
  148.     DELETE_OBJECT(pBase);  
  149.     DELETE_OBJECT(pTom);  
  150.     DELETE_OBJECT(pLucy);  
  151.    
  152.     return 0;  
  153.  }  
  154.    
  155.  /*结果 
  156.  Now Show A Role Information: 
  157.  Name:BaseRole 
  158.  Sex: Male 
  159.  Age :15 
  160.      So clever! 
  161.   
  162.   
  163.      Now Show A Role Information: 
  164.  Name:Tom 
  165.  Sex: Male 
  166.  Age :15 
  167.      A Nice People! 
  168.   
  169.   
  170.      Now Show A Role Information: 
  171.  Name:Lucy 
  172.  Sex: FeMale 
  173.  Age :18 
  174.      So clever! 
  175.      请按任意键继续. . . 
  176.  */  

抱歉!评论已关闭.