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