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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

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

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

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介紹

  • 生成器 (Builder) 接口聲明在所有類型生成器中通用的產(chǎn)品構(gòu)造步驟,一般都由虛函數(shù)組成。
  • 具體生成器 (Concrete Builders) 提供構(gòu)造過程的不同實(shí)現(xiàn)。 具體生成器也可以構(gòu)造不遵循通用接口的產(chǎn)品。
  • 產(chǎn)品 (Products) 是最終生成的對(duì)象。 由不同生成器構(gòu)造的產(chǎn)品無需屬于同一類層次結(jié)構(gòu)或接口。
  • 主管 (Director) 類定義調(diào)用構(gòu)造步驟的順序, 這樣你就可以創(chuàng)建和復(fù)用特定的產(chǎn)品配置。
  • 客戶端 (Client) 必須將某個(gè)生成器對(duì)象與主管類關(guān)聯(lián)。 一般情況下, 你只需通過主管類構(gòu)造函數(shù)的參數(shù)進(jìn)行一次性關(guān)聯(lián)即可。 此后主管類就能使用生成器對(duì)象完成后續(xù)所有的構(gòu)造任務(wù)。
  • 我們可以看到生成器執(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)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。