建造者模式:将一个复杂对象的构建与它的表示分离,是的同样的构建过程可以创建不同的表示。

说白了,就是 不同对象的表现不同(如 香辣鸡腿堡、虾堡等),但创建流程是相同的(如 烤汉堡的流程相同),那么将创建流程进行抽象。目的是防止某个对象创建时缺失某个步骤,导致对象不完整(如新增奥尔良鸡腿堡,创建时,忘记放沙拉酱)。使用建造者模式,保证了建造流程的稳定,在具体子类中实现流程中各个环节的特殊变化。

一、UML结构图

二、建造胖人、瘦人示例

建造胖人、瘦人时,头、胳膊、腿各个流程相对稳定,但是胖瘦不稳定。

  1 #include <iostream>
  2 #include <vector>
  3 #include <string>
  4
  5 using namespace std;
  6 //Product类
  7 class Product
  8 {
  9     vector<string> parts;
 10 public:
 11     void Add(const string part)
 12     {
 13         parts.push_back(part);
 14     }
 15     void Show()const
 16     {
 17         for(int i = 0 ; i < parts.size() ; i++)
 18         {
 19             cout<<parts[i]<<endl;
 20         }
 21     }
 22 };
 23 //抽象builder类
 24 class Builder
 25 {
 26 public:
 27     virtual void BuildHead() = 0;
 28     virtual void BuildBody() = 0;
 29     virtual void BuildHand() = 0;
 30     virtual void BuildFeet() = 0;
 31     virtual Product GetResult() = 0;
 32 };
 33 //具体胖人创建类
 34 class FatPersonBuilder :public Builder
 35 {
 36 private:
 37     Product product;
 38 public:
 39     virtual void BuildHead()
 40     {
 41         product.Add("胖人头");//创建瘦人的头
 42     }
 43     virtual void BuildBody()
 44     {
 45         product.Add("胖人身体");//创建瘦人的身体
 46     }
 47     virtual void BuildHand()
 48     {
 49         product.Add("胖人手");//创建瘦人的手
 50     }
 51     virtual void BuildFeet()
 52     {
 53         product.Add("胖人脚");//创建瘦人的脚
 54     }
 55     virtual Product GetResult()
 56     {
 57         return product;
 58     }
 59 };
 60 //具体瘦人人创建类
 61 class ThinPersonBuilder :public Builder
 62 {
 63 private:
 64     Product product;
 65 public:
 66     virtual void BuildHead()
 67     {
 68         product.Add("瘦人人头");//创建瘦人的头
 69     }
 70     virtual void BuildBody()
 71     {
 72         product.Add("瘦人身体");//创建瘦人的身体
 73     }
 74     virtual void BuildHand()
 75     {
 76         product.Add("瘦人手");//创建瘦人的手
 77     }
 78     virtual void BuildFeet()
 79     {
 80         product.Add("瘦人脚");//创建瘦人的脚
 81     }
 82     virtual Product GetResult()
 83     {
 84         return product;
 85     }
 86 };
 87 //Director类
 88 class Director
 89 {
 90 public:
 91     void Construct(Builder &builder)
 92     {
 93         builder.BuildHead();
 94         builder.BuildBody();
 95         builder.BuildHand();
 96         builder.BuildFeet();
 97     }
 98 };
 99
100 int main()
101 {
102     Director *director = new Director();
103     Builder *b1 = new FatPersonBuilder();
104     Builder *b2 = new ThinPersonBuilder();
105
106     director->Construct(*b1);
107     Product p1 = b1->GetResult();
108     p1.Show();
109     return 0;
110 }
示例代码
01-09 17:13