建造者模式,将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
其UML图如下: 简单理解就是Builder中定义了创建Product各个部分的接口。ConcreteBuilder中具体实现了创建Product中的各个部分的接口,就是具体的建造者。Director是根据用户的需求构建Product的(具体怎么构建,怎么把Product中的各个部件构建起来。)该模式主要用于创建一些复杂的对象,这些兑现内部构建的建造顺序通常是稳定的,但对象内部的构建通常面临着复杂的变化。
说到这里建造者模式具体实现的功能与模板方法模式有点类似。比如可以有不同得ConcreteBuilder类实现不同得创建方式。这样从应用上模板方法模式和建造者模式实现的功能是很相似的。但是建造者模式的侧重点是在于Director的不同,可以有不同的呈现方式,而模板方法模式的侧重点是算法中每一步实现的不同。另外,它们的类之间的关系是不同的。模板方法是通过继承的方式来实现的,而建造者模式是通过组合的方式实现的。模板方法模式主要用于执行不同的算法,建造者模式主要用于构建对象。不过者两种模式其实都可以实现很多相似的功能。这也没什么,本来同样的功能的实现方式也是多种多样的。主要看需求。另外在实际写程序的时候也不必拘泥于某种设计模式,只要遵守相关的原则,使整个程序高效、稳定、易扩展、易维护就行。两者使用的场景也有区别。其示例代码如下:
// BuilderModel.h文件 #pragma once #include <iostream> #include <vector> #include <string> // 产品类 class Product { public: void Add(std::string str) { m_vec.push_back(str); } void Show() { for (auto it = m_vec.cbegin(); it != m_vec.cend(); it++) { std::cout << *it << std::endl; } } private: std::vector<std::string> m_vec; }; // 建造者类 class Builder { public: virtual void BuildPartA() = 0; virtual void BuildPartB() = 0; virtual void BuildPartC() = 0; virtual Product getResult() = 0; }; class ConcreteBuilder_0 : public Builder { public: ConcreteBuilder_0() : m_p(nullptr) { m_p = new Product(); } virtual ~ConcreteBuilder_0() { if (nullptr == m_p) delete m_p; } virtual void BuildPartA() { std::string str = "Builder_0 BuildPartA"; m_p->Add(str); } virtual void BuildPartB() { std::string str = "Builder_0 BuildPartB"; m_p->Add(str); } virtual void BuildPartC() { std::string str = "Builder_0 BuildPartC"; m_p->Add(str); } Product getResult() { return *m_p; } private: Product * m_p; }; class ConcreteBuilder_1 : public Builder { public: ConcreteBuilder_1() : m_p(nullptr) { m_p = new Product(); } virtual ~ConcreteBuilder_1() { if (nullptr == m_p) delete m_p; } virtual void BuildPartA() { std::string str = "Builder_1 BuildPartA"; m_p->Add(str); } virtual void BuildPartB() { std::string str = "Builder_1 BuildPartB"; m_p->Add(str); } virtual void BuildPartC() { std::string str = "Builder_1 BuildPartC"; m_p->Add(str); } Product getResult() { return *m_p; } private: Product * m_p; }; // 指挥者类 class Director { public: // 具体怎么实现根据需求 void build(Builder *p) { p->BuildPartA(); p->BuildPartC(); p->BuildPartB(); } };测试代码如下:
#include <iostream> #include "BuilderModel.h" int main() { using namespace std; // 建造者模式 Builder *builder= new ConcreteBuilder_0(); Director * director = new Director(); director->build(builder); builder->getResult().Show(); delete builder; builder = new ConcreteBuilder_1(); director->build(builder); builder->getResult().Show(); getchar(); return 0; }测试结果如下图: