posts - 183,  comments - 10,  trackbacks - 0
来自于《大话设计模式》
原型模式(Prototype):用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。

这个设计模式在 C++ 中如何实现?

UML 图:

代码实现 C++:
  1 #include <iostream>
  2 using namespace std;
  3 
  4 class Prototype
  5 {
  6 public:
  7     virtual Prototype& Clone() = 0;
  8 };
  9 
 10 class ConcretePrototype
 11 {
 12 private:
 13     int m;
 14     char* str;
 15 public:
 16     ConcretePrototype(int n = 0const char* s = "") : m(n)
 17     {
 18         str = new char[strlen(s) + 1];
 19         if (str == 0)
 20         {
 21             exit(1);
 22         }
 23         strcpy(str, s);
 24     }
 25     ConcretePrototype(const ConcretePrototype& p)
 26     {
 27         str = new char[strlen(p.str) + 1];
 28         if (str == 0)
 29         {
 30             exit(1);
 31         }
 32         strcpy(str, p.str);
 33         m = p.m;
 34     }
 35     ConcretePrototype& operator =(const ConcretePrototype& p)
 36     {
 37         if (this == &p)
 38         {
 39             delete [] str;
 40             str = new char[strlen(p.str) + 1];
 41             if (str == 0)
 42             {
 43                 exit(1);
 44             }
 45             strcpy(str, p.str);
 46             m = p.m;
 47         }
 48         return *this;
 49     }
 50     ~ConcretePrototype()
 51     {
 52         delete [] str;
 53     }
 54     ConcretePrototype& Clone()
 55     {
 56         return *this;
 57     }
 58     void SetStr(const char* s = "")
 59     {
 60         delete [] str;
 61         str = new char[strlen(s) + 1];
 62         if (str == 0)
 63         {
 64             exit(1);
 65         }
 66         strcpy(str, s);
 67     }
 68     void SetM(int n)
 69     {
 70         m = n;
 71     }
 72     void SetStrAndM(const char* s, int n)
 73     {
 74         delete [] str;
 75         str = new char[strlen(s) + 1];
 76         if (str == 0)
 77         {
 78             exit(1);
 79         }
 80         strcpy(str, s);
 81         m = n;
 82     }
 83     void test()
 84     {
 85         cout << m << endl;
 86         cout << str << endl;
 87     }
 88 };
 89 
 90 int main()
 91 {
 92     ConcretePrototype c(5"abc");
 93     c.test();
 94 
 95     ConcretePrototype c2 = static_cast<ConcretePrototype>(c.Clone());
 96     c2.test();
 97 
 98     c2.SetStrAndM("xyz"7);
 99     c2.test();
100 
101     return 0;
102 
103 }

posted on 2011-04-25 16:03 unixfy 阅读(283) 评论(0)  编辑 收藏 引用

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理