C++之生成器(builder)模式
0. 簡介
生成器是一種創(chuàng)建型設(shè)計(jì)模式, 當(dāng)構(gòu)建一個(gè)復(fù)雜對(duì)象時(shí),將構(gòu)建過程與表示分離。使得同樣的過程創(chuàng)建不同的對(duì)象。生成器與其他創(chuàng)建型模式不同, 生成器不要求產(chǎn)品擁有通用接口。 這使得用相同的創(chuàng)建過程生成不同的產(chǎn)品成為可能。生成器方法通常支持方法鏈 (例如 someBuilder->setValueA(1)->setValueB(2)->create() ),來組成復(fù)雜的對(duì)象。相比于工廠模式專門用于生產(chǎn)一系列相關(guān)對(duì)象而言,生成器重點(diǎn)關(guān)注如何分步生成復(fù)雜對(duì)象。 這也是我們常用創(chuàng)建模式的最后一節(jié),后續(xù)將會(huì)帶來結(jié)構(gòu)模式的講解。
1. 生成器UML介紹
我們可以看到生成器執(zhí)行了單一職責(zé)原則,可以將復(fù)雜構(gòu)造代碼從產(chǎn)品的業(yè)務(wù)邏輯中分離出來。和工廠模式類似的是,生成器模式也是采用來生成器和具體生成器來構(gòu)建不同實(shí)現(xiàn)。但是不同的是工廠模式是通過工廠來對(duì)具體操作統(tǒng)一管理,但是在生成器中不同的設(shè)計(jì)了主管(Director)來構(gòu)建步驟順序。
對(duì)于軟件設(shè)計(jì),我們需要明確的是:主函數(shù)的代碼盡量減少實(shí)例初始化的動(dòng)作,將初始化的行為盡量封裝起來供主函數(shù)調(diào)用。主函數(shù)大多為業(yè)務(wù)邏輯,過多的代碼會(huì)影響美觀及維護(hù)。
2. 生成器模式模板
可以說用生成器模式來作為整套軟件的框架+工廠模式作為不同方法的可選組件的方式即可以組成一套可拓展性較為良好的框架了。
對(duì)于生成器而言,不存在和單例模式和工廠模式一樣萬用的函數(shù)通用模板,這里給出一套比較全面的生成器模式模板。
// 拿到的產(chǎn)品類 class Product1{public:std::vector<std::string> parts_;void ListParts()const{std::cout << "Product parts: ";for (size_t i=0;i<parts_.size();i++){if(parts_[i]== parts_.back()){std::cout << parts_[i];}else{std::cout << parts_[i] << ", ";}}std::cout << "\n\n"; } };// 生成器,一般存放一些通用的產(chǎn)品步驟 class Builder{public:virtual ~Builder(){}virtual void ProducePartA() const =0;virtual void ProducePartB() const =0;virtual void ProducePartC() const =0; };// 具體生成器,可以看到上述虛函數(shù)的實(shí)例化 class ConcreteBuilder1 : public Builder{private:Product1* product;public:ConcreteBuilder1(){this->Reset();}~ConcreteBuilder1(){delete product;}void Reset(){this->product= new Product1();}/*** 所有生產(chǎn)步驟都使用同一個(gè)產(chǎn)品實(shí)例*/void ProducePartA()const override{this->product->parts_.push_back("PartA1");}void ProducePartB()const override{this->product->parts_.push_back("PartB1");}void ProducePartC()const override{this->product->parts_.push_back("PartC1");}// 通過GetProduct 拿到不同步驟的執(zhí)行的結(jié)果Product1* GetProduct() {Product1* result= this->product;this->Reset();return result;} };// 定義了不同的生成方式 class Director{/*** @var Builder*/private:decltypeBuilder* builder;public:void set_builder(Builder* builder){this->builder=builder;}void BuildMinimalViableProduct(){this->builder->ProducePartA();}void BuildFullFeaturedProduct(){this->builder->ProducePartA();this->builder->ProducePartB();this->builder->ProducePartC();} };// client 可以放在一個(gè)函數(shù)中,也可以寫在main函數(shù)中 void ClientCode(Director& director) {ConcreteBuilder1* builder = new ConcreteBuilder1();director.set_builder(builder);std::cout << "Standard basic product:\n"; director.BuildMinimalViableProduct();Product1* p= builder->GetProduct();p->ListParts();delete p;std::cout << "Standard full featured product:\n"; director.BuildFullFeaturedProduct();p= builder->GetProduct();p->ListParts();delete p;// 當(dāng)然構(gòu)建器模式也可以在沒有Director類的情況下使用。std::cout << "Custom product:\n";builder->ProducePartA();builder->ProducePartC();p=builder->GetProduct();p->ListParts();delete p;delete builder; }int main(){Director* director= new Director();ClientCode(*director);delete director;return 0; }…詳情請(qǐng)參照古月居
總結(jié)
以上是生活随笔為你收集整理的C++之生成器(builder)模式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: AE中图层叠加模式的中英对照及说明
- 下一篇: C++实现经典四阶龙格库塔法解一阶微分方