C++之生成器(builder)模式
生活随笔
收集整理的這篇文章主要介紹了
C++之生成器(builder)模式
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
0. 簡介
生成器是一種創建型設計模式, 當構建一個復雜對象時,將構建過程與表示分離。使得同樣的過程創建不同的對象。生成器與其他創建型模式不同, 生成器不要求產品擁有通用接口。 這使得用相同的創建過程生成不同的產品成為可能。生成器方法通常支持方法鏈 (例如 someBuilder->setValueA(1)->setValueB(2)->create() ),來組成復雜的對象。相比于工廠模式專門用于生產一系列相關對象而言,生成器重點關注如何分步生成復雜對象。 這也是我們常用創建模式的最后一節,后續將會帶來結構模式的講解。
1. 生成器UML介紹
我們可以看到生成器執行了單一職責原則,可以將復雜構造代碼從產品的業務邏輯中分離出來。和工廠模式類似的是,生成器模式也是采用來生成器和具體生成器來構建不同實現。但是不同的是工廠模式是通過工廠來對具體操作統一管理,但是在生成器中不同的設計了主管(Director)來構建步驟順序。
對于軟件設計,我們需要明確的是:主函數的代碼盡量減少實例初始化的動作,將初始化的行為盡量封裝起來供主函數調用。主函數大多為業務邏輯,過多的代碼會影響美觀及維護。
2. 生成器模式模板
可以說用生成器模式來作為整套軟件的框架+工廠模式作為不同方法的可選組件的方式即可以組成一套可拓展性較為良好的框架了。
對于生成器而言,不存在和單例模式和工廠模式一樣萬用的函數通用模板,這里給出一套比較全面的生成器模式模板。
// 拿到的產品類 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"; } };// 生成器,一般存放一些通用的產品步驟 class Builder{public:virtual ~Builder(){}virtual void ProducePartA() const =0;virtual void ProducePartB() const =0;virtual void ProducePartC() const =0; };// 具體生成器,可以看到上述虛函數的實例化 class ConcreteBuilder1 : public Builder{private:Product1* product;public:ConcreteBuilder1(){this->Reset();}~ConcreteBuilder1(){delete product;}void Reset(){this->product= new Product1();}/*** 所有生產步驟都使用同一個產品實例*/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 拿到不同步驟的執行的結果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 可以放在一個函數中,也可以寫在main函數中 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;// 當然構建器模式也可以在沒有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; }…詳情請參照古月居
總結
以上是生活随笔為你收集整理的C++之生成器(builder)模式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: AE中图层叠加模式的中英对照及说明
- 下一篇: C++实现经典四阶龙格库塔法解一阶微分方