設計模式之建造者模式
掃描二維碼
隨時隨地手機看文章
建造者模式用于構造一個復雜的對象,強調的是一步步構造對象,就像俄羅斯套娃一樣,必須按順序一步一步的套,才可以套娃成功。
如果提供了多個不同大小的娃,如何套,按什么順序套呢,可以把套娃這些繁瑣的操作交給中介去做。這就是建造者模式,即外部只需要提供產品需要的各個零部件,將這些零部件提供給建造者,有個指揮家會指揮建造者一步步組裝成產品,外部不需要知道具體構建細節(jié)就可以直接獲取產品。
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,它作為指揮家,一方面隔離產品的創(chuàng)建過程,一方面控制產品的創(chuàng)建步驟。外部只需要知道具體建造者的類型,指揮家就可以調用建造者的相應方法去構建,外部就可以獲取一個完整的產品對象。
建造者模式不僅解耦了產品的創(chuàng)建過程,而且每一個具體建造者都相對獨立,通過傳入不同的具體建造者給指揮家,就可以得到不同的產品對象,通過增加不同的具體建造者就可以得到更多的產品對象,符合開閉原則。
建造者模式中所創(chuàng)建的產品一般創(chuàng)建步驟都比較相似,如果產品之間差異較大,則不適合使用建造者模式。
沒錯,今天的文章就是這么短
往期推薦
免責聲明:本文內容由21ic獲得授權后發(fā)布,版權歸原作者所有,本平臺僅提供信息存儲服務。文章僅代表作者個人觀點,不代表本平臺立場,如有問題,請聯系我們,謝謝!