设计模式之建造者模式
建造者模式,将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
其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 }
测试结果如下图:
标签:Product,Builder,建造,C++,ConcreteBuilder,virtual,str,设计模式,void From: https://www.cnblogs.com/ybqjymy/p/17535002.html