本文章属于专栏《设计模式(极简c++版)》
继续上一篇《工厂模式(极简c++)》。本章简要说明建造者模式。本文分为**++模式说明、本质思想、实践建议、代码示例++**四个部分。
模式说明:
- 方案:不同场景对类的构建有不同需求时,使用类提供的构建接口来构建,而不是直接给成员变量赋值
- 优点:把构建行为,和类的结构分离。增加了代码可扩展性,降低未来维护成本。
- 缺点:引入了多个额外的类和接口,增加了代码的复杂度。增加了当前维护成本。
本质思想: "类构建过程"和"类的属性、结构、行为"分离。将对象的构建过程拆分成多个步骤,并定义一个抽象接口以及具体的实现类来完成每个步骤。
实践建议: 不使用建造者模式。直到设计、开发时发现,对象的构建过程比较复杂,且在较多场景需要构造,且构造过程不同。个人更偏爱工厂模式来做创建,将类的创建过程封装到一个函数,如果有不同的构建需求,通过输入参数走不同的构建逻辑,如果类的构建十分负责,如构建一个"人",则通过组合的方式,构建多个类(如手脚头等),挂在"人"下面。在生产代码中,我至今还没见到过使用建造者模式的业务代码。这里的本质是大部分场景,"未来降低的维护成本"低于"当前增加的维护成本"
代码示例:
cpp
#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: Brown
return 0;
}
下一篇:《单例模式(极简c++)》