本文章属于专栏《设计模式(极简c++版)》
继续上一篇《工厂模式(极简c++)》。本章简要说明建造者模式。本文分为模式说明、本质思想、实践建议、代码示例四个部分。
模式说明:
- 方案:不同场景对类的构建有不同需求时,使用类提供的构建接口来构建,而不是直接给成员变量赋值
- 优点:把构建行为,和类的结构分离。增加了代码可扩展性,降低未来维护成本。
- 缺点:引入了多个额外的类和接口,增加了代码的复杂度。增加了当前维护成本。
本质思想: “类构建过程”和“类的属性、结构、行为”分离。将对象的构建过程拆分成多个步骤,并定义一个抽象接口以及具体的实现类来完成每个步骤。
实践建议: 不使用建造者模式。直到设计、开发时发现,对象的构建过程比较复杂,且在较多场景需要构造,且构造过程不同。个人更偏爱工厂模式来做创建,将类的创建过程封装到一个函数,如果有不同的构建需求,通过输入参数走不同的构建逻辑,如果类的构建十分负责,如构建一个“人”,则通过组合的方式,构建多个类(如手脚头等),挂在“人”下面。在生产代码中,我至今还没见到过使用建造者模式的业务代码。这里的本质是大部分场景,“未来降低的维护成本”低于“当前增加的维护成本”
代码示例:
#include <iostream>
#include <string>// 产品类
class Bird {
public:void setSpecies(const std::string& species) {m_species = species;}void setColor(const std::string& color) {m_color = color;}void show() {std::cout << "Species: " << m_species << std::endl;std::cout << "Color: " << m_color << std::endl;}
private:std::string m_species;std::string m_color;
};// 抽象建造者类
class BirdBuilder {
public:virtual void buildSpecies() = 0;virtual void buildColor() = 0;virtual Bird getResult() = 0;
};// 具体建造者类
class SparrowBuilder : public BirdBuilder {
public:void buildSpecies() override {m_bird.setSpecies("Sparrow");}void buildColor() override {m_bird.setColor("Brown");}Bird getResult() override {return m_bird;}
private:Bird m_bird;
};// 指导者类
class BirdDirector {
public:BirdDirector(BirdBuilder* builder) : m_builder(builder) {}void construct() {m_builder->buildSpecies();m_builder->buildColor();}
private:BirdBuilder* m_builder;
};int main() {SparrowBuilder builder;BirdDirector director(&builder);director.construct();Bird bird = builder.getResult();bird.show();// 输出:// Species: Sparrow// Color: Brownreturn 0;
}