查看原文
其他

设计模式之建造者模式

程序喵大人 程序喵大人 2022-08-22
大家好,我是程序喵
是的,
我又来了!


建造者模式用于构造一个复杂的对象,强调的是一步步构造对象,就像俄罗斯套娃一样,必须按顺序一步一步的套,才可以套娃成功。


如果提供了多个不同大小的娃,如何套,按什么顺序套呢,可以把套娃这些繁琐的操作交给中介去做。这就是建造者模式,即外部只需要提供产品需要的各个零部件,将这些零部件提供给建造者,有个指挥家会指挥建造者一步步组装成产品,外部不需要知道具体构建细节就可以直接获取产品。

#include <array>#include <iostream>
class Product { public: void SetFirst(int value) { this->first_ = value; flag_[0] = true; } void SetSecond(int value) { if (!flag_[0]) return; this->second_ = value; flag_[1] = true; } void SetThird(int value) { if (!flag_[0] || !flag_[1]) return; this->third_ = value; flag_[2] = true; } bool IsOk() { return flag_[0] && flag_[1] && flag_[2]; }
private: std::array<bool, 3> flag_; int first_; int second_; int third_;};
class AbstractBuilder { public: AbstractBuilder() {} virtual ~AbstractBuilder() {}
virtual void BuildFirst() = 0; virtual void BuildSecond() = 0; virtual void BuildThird() = 0; virtual Product* GetProduct() = 0;};
class ConcreteBuilder : public AbstractBuilder { public: ConcreteBuilder() { this->product_ = new Product(); } ~ConcreteBuilder() { delete this->product_; }
void BuildFirst() { this->product_->SetFirst(1); } void BuildSecond() { this->product_->SetSecond(2); } void BuildThird() { this->product_->SetThird(3); } Product* GetProduct() { return this->product_; }
private: Product* product_;};
class Director { public: Director(AbstractBuilder* builder) { this->builder_ = builder; } ~Director() {}
Product* Construct() { this->builder_->BuildFirst(); this->builder_->BuildSecond(); this->builder_->BuildThird(); return this->builder_->GetProduct(); }
private: AbstractBuilder* builder_;};
int main() { AbstractBuilder* builder = new ConcreteBuilder(); Director* director = new Director(builder); Product* product = director->Construct(); std::cout << product->IsOk() << std::endl; return 0;}

可以看到代码中引入了Director,它作为指挥家,一方面隔离产品的创建过程,一方面控制产品的创建步骤。外部只需要知道具体建造者的类型,指挥家就可以调用建造者的相应方法去构建,外部就可以获取一个完整的产品对象。

建造者模式不仅解耦了产品的创建过程,而且每一个具体建造者都相对独立,通过传入不同的具体建造者给指挥家,就可以得到不同的产品对象,通过增加不同的具体建造者就可以得到更多的产品对象,符合开闭原则。

建造者模式中所创建的产品一般创建步骤都比较相似,如果产品之间差异较大,则不适合使用建造者模式。

没错,今天的文章就是这么短




往期推荐



您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存