设计模式之建造者模式
建造者模式,将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
其UML图如下:
简单理解就是Builder中定义了创建Product各个部分的接口。ConcreteBuilder中具体实现了创建Product中的各个部分的接口,就是具体的建造者。Director是根据用户的需求构建Product的(具体怎么构建,怎么把Product中的各个部件构建起来。)该模式主要用于创建一些复杂的对象,这些兑现内部构建的建造顺序通常是稳定的,但对象内部的构建通常面临着复杂的变化。
说到这里建造者模式具体实现的功能与模板方法模式有点类似。比如可以有不同得ConcreteBuilder类实现不同得创建方式。这样从应用上模板方法模式和建造者模式实现的功能是很相似的。但是建造者模式的侧重点是在于Director的不同,可以有不同的呈现方式,而模板方法模式的侧重点是算法中每一步实现的不同。另外,它们的类之间的关系是不同的。模板方法是通过继承的方式来实现的,而建造者模式是通过组合的方式实现的。模板方法模式主要用于执行不同的算法,建造者模式主要用于构建对象。不过者两种模式其实都可以实现很多相似的功能。这也没什么,本来同样的功能的实现方式也是多种多样的。主要看需求。另外在实际写程序的时候也不必拘泥于某种设计模式,只要遵守相关的原则,使整个程序高效、稳定、易扩展、易维护就行。两者使用的场景也有区别。其示例代码如下:
1 // BuilderModel.h文件
2 #pragma once
3 #include <iostream>
4 #include <vector>
5 #include <string>
6
7 // 产品类
8 class Product
9 {
10 public:
11 void Add(std::string str)
12 {
13 m_vec.push_back(str);
14 }
15 void Show()
16 {
17 for (auto it = m_vec.cbegin(); it != m_vec.cend(); it++)
18 {
19 std::cout << *it << std::endl;
20 }
21 }
22 private:
23 std::vector<std::string> m_vec;
24 };
25 // 建造者类
26 class Builder
27 {
28 public:
29 virtual void BuildPartA() = 0;
30 virtual void BuildPartB() = 0;
31 virtual void BuildPartC() = 0;
32 virtual Product getResult() = 0;
33 };
34
35 class ConcreteBuilder_0 : public Builder
36 {
37 public:
38 ConcreteBuilder_0() : m_p(nullptr)
39 {
40 m_p = new Product();
41 }
42 virtual ~ConcreteBuilder_0()
43 {
44 if (nullptr == m_p)
45 delete m_p;
46 }
47 virtual void BuildPartA()
48 {
49 std::string str = "Builder_0 BuildPartA";
50 m_p->Add(str);
51 }
52 virtual void BuildPartB()
53 {
54 std::string str = "Builder_0 BuildPartB";
55 m_p->Add(str);
56 }
57 virtual void BuildPartC()
58 {
59 std::string str = "Builder_0 BuildPartC";
60 m_p->Add(str);
61 }
62 Product getResult()
63 {
64 return *m_p;
65 }
66 private:
67 Product * m_p;
68 };
69
70 class ConcreteBuilder_1 : public Builder
71 {
72 public:
73 ConcreteBuilder_1() : m_p(nullptr)
74 {
75 m_p = new Product();
76 }
77 virtual ~ConcreteBuilder_1()
78 {
79 if (nullptr == m_p)
80 delete m_p;
81 }
82 virtual void BuildPartA()
83 {
84 std::string str = "Builder_1 BuildPartA";
85 m_p->Add(str);
86 }
87 virtual void BuildPartB()
88 {
89 std::string str = "Builder_1 BuildPartB";
90 m_p->Add(str);
91 }
92 virtual void BuildPartC()
93 {
94 std::string str = "Builder_1 BuildPartC";
95 m_p->Add(str);
96 }
97 Product getResult()
98 {
99 return *m_p;
100 }
101 private:
102 Product * m_p;
103 };
104 // 指挥者类
105 class Director
106 {
107 public:
108 // 具体怎么实现根据需求
109 void build(Builder *p)
110 {
111 p->BuildPartA();
112 p->BuildPartC();
113 p->BuildPartB();
114 }
115 };
测试代码如下:
1 #include <iostream>
2 #include "BuilderModel.h"
3
4 int main()
5 {
6 using namespace std;
7 // 建造者模式
8 Builder *builder= new ConcreteBuilder_0();
9 Director * director = new Director();
10 director->build(builder);
11 builder->getResult().Show();
12
13 delete builder;
14 builder = new ConcreteBuilder_1();
15 director->build(builder);
16 builder->getResult().Show();
17 getchar();
18 return 0;
19 }
测试结果如下图: