读《大话设计模式》---原型模式(Prototype)

原型模式:

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

原型模式其实就是从一个对象再创建另外一个可定制的对象,而且不需知道任何创建的细节。

 

我认为原型模式在C++中其实就相当于拷贝构造函数,clone执行的是浅拷贝,copy执行的是深拷贝。

原型模式的基本代码:

 

  1. #include <iostream>
  2. #include <string>
  3. using namespace std;
  4. class ProtoType
  5. {
  6. public:
  7.     virtual char * GetID() = 0;
  8.     char * mid;
  9.     int n;
  10. };
  11. class ConcreteProtype1 :  public ProtoType
  12. {
  13. public:
  14.     ConcreteProtype1()
  15.     {
  16.         mid = NULL;
  17.     }
  18.     /*
  19.     //ProtoType
  20.     //浅拷贝(clone)
  21.     ConcreteProtype1(const ConcreteProtype1 & cs) 
  22.     {
  23.         mid = cs.mid;
  24.         n = cs.n;
  25.     }   
  26.     void SetID(int N, char * id)
  27.     {
  28.         mid = id;
  29.         n = N;
  30.     }
  31.     */
  32.     //深拷贝(copy)
  33.     ConcreteProtype1(const ConcreteProtype1 & cs) 
  34.     {
  35.         n = cs.n;
  36.         mid = NULL;
  37.         if(cs.mid != NULL)
  38.         {
  39.             mid = new char[n];
  40.             strcpy(mid, cs.mid);
  41.         }
  42.     }
  43.     void SetID(int N, char * id)
  44.     {
  45.         if(mid == NULL)
  46.         {
  47.             mid = new char[N];
  48.             strcpy(mid, id);
  49.         }
  50.         n = N;
  51.     }
  52.     ~ConcreteProtype1()
  53.     {
  54.         if(mid != NULL)
  55.             delete mid;
  56.     }   
  57.     char * GetID()
  58.     {
  59.         return mid;
  60.     }
  61.     void Show()
  62.     {
  63.         if(mid != NULL)
  64.             cout << GetID() << endl;
  65.     }
  66. };
  67. int main(int argc, char* argv[])
  68. {
  69.     ConcreteProtype1 CP1;
  70.     ConcreteProtype1 CP2 = CP1;
  71.     //浅拷贝(clone)    
  72.     /*
  73.     char * Name = new char[10];
  74.     strcpy(Name,"小菜");
  75.     CP1.SetID(10, Name);    
  76.     strcpy(Name,"大鸟");
  77.     CP2.SetID(10, Name);
  78.     CP1.Show();
  79.     CP2.Show();
  80.     */ 
  81.     //深拷贝(copy)
  82.     CP1.SetID(10, "小菜");    
  83.     CP2.SetID(10, "大鸟");
  84.     CP1.Show();
  85.     CP2.Show();
  86.    
  87.     return 0;
  88. }
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值