posts - 183,  comments - 10,  trackbacks - 0
来自于《大话设计模式》
建造者模式(Builder):将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

UML 类图:

代码实现 C++:
  1 #include <iostream>
  2 #include <string>
  3 #include <list>
  4 using namespace std;
  5 
  6 class Product
  7 {
  8 private:
  9     list<string> parts;
 10 public:
 11     void Add(string s)
 12     {
 13         parts.push_back(s);
 14     }
 15     void Show()
 16     {
 17         for (list<string>::const_iterator cit = parts.begin(); cit != parts.end(); ++cit)
 18         {
 19             cout << *cit << endl;
 20         }
 21     }
 22 };
 23 
 24 class Builder
 25 {
 26 public:
 27     Builder() {}
 28     virtual ~Builder() {}
 29     virtual void BuildPartA() = 0;
 30     virtual void BuildPartB() = 0;
 31     virtual Product* GetResult() = 0;
 32 };
 33 
 34 class ConcreteBuilder1 : public Builder
 35 {
 36 private:
 37     Product* p;
 38 public:
 39     ConcreteBuilder1() : p(new Product) {}
 40     virtual ~ConcreteBuilder1()
 41     {
 42         delete p;
 43     }
 44     virtual void BuildPartA()
 45     {
 46         p->Add("部件 A - 1");
 47     }
 48     virtual void BuildPartB()
 49     {
 50         p->Add("部件 B - 1");
 51     }
 52     virtual Product* GetResult()
 53     {
 54         return p;
 55     }
 56 };
 57 
 58 class ConcreteBuilder2 : public Builder
 59 {
 60 private:
 61     Product* p;
 62 public:
 63     ConcreteBuilder2() : p(new Product) {}
 64     virtual ~ConcreteBuilder2()
 65     {
 66         delete p;
 67     }
 68     virtual void BuildPartA()
 69     {
 70         p->Add("部件 A - 2");
 71     }
 72     virtual void BuildPartB()
 73     {
 74         p->Add("部件 B - 2");
 75     }
 76     virtual Product* GetResult()
 77     {
 78         return p;
 79     }
 80 };
 81 
 82 class Director
 83 {
 84 public:
 85     void Construct(Builder& b)
 86     {
 87         b.BuildPartA();
 88         b.BuildPartB();
 89     }
 90 };
 91 
 92 int main()
 93 {
 94     Director d;
 95     ConcreteBuilder1 b1;
 96     ConcreteBuilder2 b2;
 97 
 98     d.Construct(b1);
 99     Product* p1 = b1.GetResult();
100     p1->Show();
101     
102     d.Construct(b2);
103     Product* p2 = b2.GetResult();
104     p2->Show();
105 
106     return 0;
107 }
posted on 2011-04-26 18:00 unixfy 阅读(229) 评论(0)  编辑 收藏 引用

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