日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++之生成器(builder)模式

發布時間:2023/12/31 c/c++ 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++之生成器(builder)模式 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

0. 簡介

生成器是一種創建型設計模式, 當構建一個復雜對象時,將構建過程與表示分離。使得同樣的過程創建不同的對象。生成器與其他創建型模式不同, 生成器不要求產品擁有通用接口。 這使得用相同的創建過程生成不同的產品成為可能。生成器方法通常支持方法鏈 (例如 someBuilder->setValueA(1)->setValueB(2)->create() ),來組成復雜的對象。相比于工廠模式專門用于生產一系列相關對象而言,生成器重點關注如何分步生成復雜對象。 這也是我們常用創建模式的最后一節,后續將會帶來結構模式的講解。

1. 生成器UML介紹

  • 生成器 (Builder) 接口聲明在所有類型生成器中通用的產品構造步驟,一般都由虛函數組成。
  • 具體生成器 (Concrete Builders) 提供構造過程的不同實現。 具體生成器也可以構造不遵循通用接口的產品。
  • 產品 (Products) 是最終生成的對象。 由不同生成器構造的產品無需屬于同一類層次結構或接口。
  • 主管 (Director) 類定義調用構造步驟的順序, 這樣你就可以創建和復用特定的產品配置。
  • 客戶端 (Client) 必須將某個生成器對象與主管類關聯。 一般情況下, 你只需通過主管類構造函數的參數進行一次性關聯即可。 此后主管類就能使用生成器對象完成后續所有的構造任務。
  • 我們可以看到生成器執行了單一職責原則,可以將復雜構造代碼從產品的業務邏輯中分離出來。和工廠模式類似的是,生成器模式也是采用來生成器和具體生成器來構建不同實現。但是不同的是工廠模式是通過工廠來對具體操作統一管理,但是在生成器中不同的設計了主管(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)模式的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。