设计模式系列--建造者模式
2022/1/7...大约 3 分钟
设计模式系列--建造者模式
本文主要介绍23种设计模式之一的建造者模式,首先讲什么是建造者,为什么要叫建造者模式,理解了建造者模式的概念后,然后介绍什么场景下使用建造者模式,然后给出建造者模式的c++实现,最后介绍建造者模式和工厂模式之间的区别
什么是建造者模式
汉语词典是这样解释的:
建造:即将许多材料依设计规格,逐步施工,而成为建筑物或结构物的过程或方式。
建造是一个过程,一种方法,对不同材料进行加工生产的行为,操作对象是材料;核心是方法,对象是材料。
而建造者,就是将很多材料用某些方式逐步施工最后制造了建筑物或结构体的人;核心是人。
建造者模式就是利用建造的概念,将不同的材料通过某种方法建造一个复杂对象的的计算机模型,原理与建造过程一致,所以叫建造者模式。
建造者模式的使用场景
有这样一个场景:我要组装一台计算机,这台计算机包含CPU,主板,内存条,风扇等等一系列的各种零部件。
用已经介绍了的工厂模式就不能模拟这种场景,因为工厂模式的使用场景是面向工厂生产的产品,产品可以看作是一个简单对象,
而这个场景中的计算机可以看作是由一个个简单对象组成的复杂对象。
看到这里是不是想起了上面的建造的概念?对,这种场景就适合使用建造者模式来处理。
建造者模式的适用场景就是:一个复杂对象有很多个简单对象组成(姑且看作为简单对象,其实简不简单无所谓,只要是个独立对象就可以),需要用某种方法来创建这个对象。
建造者模式把复杂对象的生成过程简化,解除了复杂对象和子对象之间的耦合,而控制生成对象的方法,就可以创建不同的复杂对象,使用者只需要实现方法的修改即可。
建造者模式的c++实现
class CPU {}; // CPU
class Mobo {}; // 主板
class RAM{}; // 内存条
class CPU_A: public CPU{}; // CPU_A
class Mobo_A: public Mobo{}; // Mobo_A
class RAM_A: public RAM{}; // RAM_A
class Computer { // 复杂对象
public:
Computer() = default;
~Computer() = default;
static std::shared_ptr<Computer> Build(std::shared_ptr<ComputerBuilder> builder) {
auto computer = std::make_shared<Computer>();
computer->setCPU(builder.buildCPU());
computer->setMobo(builder.buildMobo());
computer->setRAM(builder.buildRAM());
}
void setCPU(std::shared_ptr<CPU> cpu) {cpu_ = cpu;}
void setMobo(std::shared_ptr<Mobo> mobo) {mobo_ = mobo;}
void setRAM(std::shared_ptr<RAM> ram) {ram_ = ram;}
private:
std::shared_ptr<CPU> cpu_;
std::shared_ptr<Mobo> mobo_;
std::shared_ptr<RAM> ram_;
};
class ComputerBuilder { // 复杂对象的创建方式
public:
ComputerBuilder() = default;
virtual ~ComputerBuilder() = default;
virtual std::shared_ptr<CPU> buildCPU() = 0;
virtual std::shared_ptr<Mobo> buildMobo() = 0;
virtual std::shared_ptr<RAM> buildRAM() = 0;
};
class ComputerBuilderXX: public ComputerBuilder{ // XX建造方法
public:
~ComputerBuilderXX() override = default;
std::shared_ptr<CPU> buildCPU() override { return std::make_shared<CPU_A>();}
std::shared_ptr<Mobo> buildMobo() override {return std::make_shared<Mobo_A>();}
std::shared_ptr<RAM> buildRAM() override {return std::make_shared<RAM_A>();}
};
// 创建者创建
int main(){
auto builder = std::make_shared<ComputerBuilderXX>();
auto computer = Computer::Build(builder);
// computer 即是通过XX方法创建的复杂对象
}
总结
简单来说,工厂模式针对创建简单对象,建造者模式针对由简单对象堆砌起来的复杂对象,工厂模式需要修改工厂创建方法,建造者模式需要修改建造方法,两种模式个有特点,也极易混淆
- *另外,在日常的开发过程种,很多情况下会遇到构造函数多参数的场景,这种情况有点类似创建者模式,在某些情况下也是推荐使用创建者模式来构造的,留着下次在介绍吧