设计模式之建造者模式
时间:2020-08-24 10:04:52
手机看文章
扫描二维码
随时随地手机看文章
[导读]大家好,我是程序喵 是的, 我又来了! 建造者模式用于构造一个复杂的对象,强调的是一步步构造对象,就像俄罗斯套娃一样,必须按顺序一步一步的套,才可以套娃成功。 如果提供了多个不同大小的娃,如何套,按什么顺序套呢,可以把套娃这些繁琐的操作交给中介
建造者模式用于构造一个复杂的对象,强调的是一步步构造对象,就像俄罗斯套娃一样,必须按顺序一步一步的套,才可以套娃成功。
如果提供了多个不同大小的娃,如何套,按什么顺序套呢,可以把套娃这些繁琐的操作交给中介去做。这就是建造者模式,即外部只需要提供产品需要的各个零部件,将这些零部件提供给建造者,有个指挥家会指挥建造者一步步组装成产品,外部不需要知道具体构建细节就可以直接获取产品。
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,它作为指挥家,一方面隔离产品的创建过程,一方面控制产品的创建步骤。外部只需要知道具体建造者的类型,指挥家就可以调用建造者的相应方法去构建,外部就可以获取一个完整的产品对象。
建造者模式不仅解耦了产品的创建过程,而且每一个具体建造者都相对独立,通过传入不同的具体建造者给指挥家,就可以得到不同的产品对象,通过增加不同的具体建造者就可以得到更多的产品对象,符合开闭原则。
建造者模式中所创建的产品一般创建步骤都比较相似,如果产品之间差异较大,则不适合使用建造者模式。
没错,今天的文章就是这么短
往期推荐
免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!