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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

设计模式(4):生成器模式(Builder)

發(fā)布時間:2023/12/31 asp.net 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 设计模式(4):生成器模式(Builder) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

1. 說明

什么是生成器模式
生成器模式是創(chuàng)建型模式的一種,指使用多個實例通過一定的步驟來生成所需的類的實例,這里的步驟是相同的,但是通過傳遞不同的參數(shù)來達到生成不同實例的目的。

意圖
將一個復(fù)雜對象的構(gòu)建與它的表示分離,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示。

使用的場合
在以下情況使用Builder模式:

  • 當(dāng)創(chuàng)建復(fù)雜對象的算法應(yīng)該獨立于該對象的組成部分以及它們的裝配方式時;
  • 當(dāng)構(gòu)造過程必須允許被構(gòu)造的對象有不同的表示時。

效果

  • 它使你可以改變一個產(chǎn)品的內(nèi)部表示。Builder對象提供給導(dǎo)向器一個構(gòu)造產(chǎn)品的抽象接口。該接口使得生成器可以隱藏這個產(chǎn)品的表示和內(nèi)部結(jié)構(gòu)。它同時也隱藏了該產(chǎn)品是如何裝配的。因為產(chǎn)品是通過抽象接口構(gòu)造的,你在改變該產(chǎn)品的內(nèi)部表示是所要做的只是定義一個新的生成器。
  • 它將構(gòu)造代碼和表示代碼分開。Builder模式通過封裝一個復(fù)雜對象的創(chuàng)建和表示方式提高了對象的模塊性。客戶不需要知道定義產(chǎn)品內(nèi)部結(jié)構(gòu)的類的所有信息,這些類是不出現(xiàn)在Builder接口中的。
  • 它使你可對構(gòu)造過程進行更精細的控制。Builder模式與一下子就生成產(chǎn)品的創(chuàng)建型模式不同,它是在導(dǎo)向器的控制下一步一步構(gòu)造產(chǎn)品的。僅當(dāng)該產(chǎn)品完成時導(dǎo)向器才從生成器中取回它。因此Builder接口相比其他創(chuàng)建型模式能更好地反映產(chǎn)品的構(gòu)造過程。這使你可以更精細地控制構(gòu)建過程,從而能更精細地控制所得產(chǎn)品的內(nèi)部結(jié)構(gòu)。
  • 優(yōu)點

  • 建造者獨立,易擴展。
  • 便于控制細節(jié)風(fēng)險。
  • 缺點

  • 產(chǎn)品必須有共同點,范圍有限制。
  • 如內(nèi)部變化復(fù)雜,會有很多的建造類。

  • 2. 示例

    2.1 框架

    我們假設(shè)一個快餐店的商業(yè)案例,其中,一個典型的套餐可以是一個漢堡(Burger)和一杯冷飲(Cold drink)。漢堡(Burger)可以是素食漢堡(Veg Burger)或雞肉漢堡(Chicken Burger),它們是包在紙盒中。冷飲(Cold drink)可以是可口可樂(coke)或百事可樂(pepsi),它們是裝在瓶子中。

    我們將創(chuàng)建一個表示食物條目(比如漢堡和冷飲)的 Item 接口和實現(xiàn) Item 接口的實體類,以及一個表示食物包裝的 Packing 接口和實現(xiàn) Packing 接口的實體類,漢堡是包在紙盒中,冷飲是裝在瓶子中。

    然后我們創(chuàng)建一個 Meal 類,通過結(jié)Item 來創(chuàng)建不同類型的 Meal 對象的 MealBuilder。Demo 使用 MealBuilder 來創(chuàng)建一個 Meal。

    結(jié)構(gòu)圖如下:

    2.2 代碼實現(xiàn)

    2.2.1 抽象接口類

    Packing.h

    #ifndef __PACKING__ #define __PACKING__ class Packing {public:virtual string pack() = 0; }; #endif

    Packing 是食品包裝的抽象接口;

    Item.h

    #ifndef __ITEM__ #define __ITEM__class Packing {public:virtual string pack() = 0; }class Item{public:virtual string name() = 0;virtual Packing *packing() = 0;virtual float price() = 0; }; #endif

    Item 則是食物條目的抽象接口類;

    2.2.2 實現(xiàn)Packing接口的實體類

    Wrapper.h

    #ifndef __WRAPPER__ #define __WRAPPER__#include "Packing.h"class Wrapper : public Packing{public:string pack() {return "Wrapper";}; }; #endif

    Bottle.h

    #ifndef __BOTTLE__ #define __BOTTLE__#include "Packing.h"class Bottle : public Packing{public:string pack() {return "Bottle";}; }; #endif


    2.2.3 創(chuàng)建實現(xiàn) Item 接口的抽象類,該類提供了默認的功能

    Burger.h

    #ifndef __BURGER__ #define __BURGER__#include "Item.h" #include "Packing.h" #include "Wrapper.h" #include "Bottle.h"class Burger : public Item{public:Packing *packing() {return new Wrapper();}; };class VegBurger : public Burger{public:float price() {return 25.0;};string name() {return "Veg Burger";}; };class ChickenBurger : public Burger{public:float price() {return 50.0;};string name() {return "ChickenBurger";}; }; #endif

    Drink.h

    #ifndef __DRINK__ #define __DRINK__#include "Item.h" #include "Packing.h" #include "Wrapper.h" #include "Bottle.h"class Drink : public Item{public:Packing *packing() {return new Bottle();}; };class Coke : public Drink{public:float price() {return 30.0;};string name() {return "Coke";}; };class Pepsi : public Drink{public:float price() {return 35.0;};string name() {return "Pepsi";}; }; #endif


    2.2.4 創(chuàng)建一個 Meal 類,帶有上面定義的 Item 對象

    Meal.h

    #ifndef __MEAL__ #define __MEAL__#include <vector>#include "Item.h"using namespace std;class Meal{public:Meal() {items = new vector<Item*>;};void AddItem(Item *it) {items->push_back(it);};float GetCost();void ShowItem();private:vector<Item*> *items; }; #endif

    Meal.cpp

    #include <iostream>#include "Meal.h" #include "Burger.h" #include "Drink.h"float Meal::GetCost() {float cost = 0;auto item = items->begin();while(item != items->end()){cost += (*item)->price();item++;}return cost; }void Meal::ShowItem() {auto item = items->begin();while(item != items->end()){std::cout << "Item: " << (*item)->name() << ", Packing: " << (*item)->packing()->pack() << ", Price: " << (*item)->price() << std::endl;item++;} }


    2.2.5 創(chuàng)建一個 MealBuilder 類,實際的 builder 類負責(zé)創(chuàng)建 Meal 對象

    MealBuilder.h

    #ifndef __MEALBUILDER__ #define __MEALBUILDER__#include "Meal.h"class MealBuilder{public:Meal *PrepareVegMeal();Meal *PrepareNonVegMeal(); }; #endif

    MealBuilder.cpp

    #include "MealBuilder.h" #include "Burger.h" #include "Drink.h"Meal *MealBuilder::PrepareVegMeal() {Item *vb = (Item *)new VegBurger();Item *coke = (Item *)new Coke();Meal *meal = new Meal();meal->AddItem(vb);meal->AddItem(coke);return meal; }Meal *MealBuilder::PrepareNonVegMeal() {Item *cb = (Item *)new ChickenBurger();Item *pp = (Item *)new Pepsi();Meal *meal = new Meal();meal->AddItem(cb);meal->AddItem(pp);return meal; }

    2.2.6 Demo 使用 MealBuider 來演示建造者模式(Builder Pattern)

    Demo.cpp

    #include "MealBuilder.h"int main(int argc, char **argv) {MealBuilder *mb = new MealBuilder();Meal *vegm = mb->PrepareVegMeal();vegm->ShowItem();std::cout << "VegMeal price: " << vegm->GetCost() << std::endl;Meal *nvegm = mb->PrepareNonVegMeal();nvegm->ShowItem();std::cout << "VegMeal price: " << nvegm->GetCost() << std::endl;return 0; }


    2.3 編譯運行

    g++ *.cpp ./a.out


    2.4 結(jié)果

    Item: Veg Burger, Packing: Wrapper, Price: 25 Item: Coke, Packing: Bottle, Price: 30 VegMeal price: 55 Item: ChickenBurger, Packing: Wrapper, Price: 50 Item: Pepsi, Packing: Bottle, Price: 35 VegMeal price: 85


    3. 總結(jié)

    Builder模式與Abstract Factory或Factory模式相似,都可以創(chuàng)建復(fù)雜對象,但是不同之處在于Builder模式著重于一步步構(gòu)造一個復(fù)雜對象,在最后一步返回產(chǎn)品,強調(diào)構(gòu)造細節(jié),而后兩者著重于多個系列的產(chǎn)品一次生成,通常產(chǎn)品是立即返回的。

    參考資料

    《設(shè)計模式 可復(fù)用面向?qū)ο筌浖幕A(chǔ)》
    https://www.runoob.com/design-pattern/builder-pattern.html

    總結(jié)

    以上是生活随笔為你收集整理的设计模式(4):生成器模式(Builder)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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