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

歡迎訪問 生活随笔!

生活随笔

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

c/c++

设计模式之Builder模式 (C++实现)

發布時間:2025/3/15 c/c++ 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 设计模式之Builder模式 (C++实现) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

剛開始我一直感覺建造者模式不太好懂,也許是我笨了點緣故,勤能補拙嘛,所以只能多看多想了

大話設計模式里面那個對于建造者模式我講解,個人感覺不太好理解,我是看了很多遍也沒體會到那樣設計的精髓,后來在另一本設計模式上才稍微領悟到了點,

?

在這里我想到一個比較形象的例子:

比如我某天去吃蘭州拉面,他們有不同的套餐,套餐里包含的種類是一樣的,都有一
碗拉面,一份泡菜,一杯飲料。但是不同的套餐里這3樣又都不是全部一樣的,也許分量和品質有差別。此時我們就可以用建造者模式。

這里我沒有合適的UML圖,大致說一下模型:客戶根據套餐不同,跟收銀員點了一份A套餐的拉面,另一名客戶同時又點了一份B套餐的拉面,

這時收銀員把這兩個單子轉交給后臺,其實也就是廚房,廚師看到這兩個單子的不同而煮不同的拉面,然后返回給服務員,服務員分發拉面給客戶!

?

1.建造者(B u i l d e r)角色:給出一個抽象接口,以規范產品對象的各個組成成分的建造。


2.具體建造者(Co n cre te?? B u i l d e r)角色:擔任這個角色的是于應用程序緊密相關的類,它們在應用程序調用下創
建產品實例。


3.指導者(D i re cto r)角色:擔任這個角色的類調用具體建造者角色以創建產品對象。是收銀員,他知道我想要什么套餐,他會告訴里面的
店員工去準備什么套餐。

用代碼實現如下:

[cpp] view plaincopyprint?
  • class?Food?????//定義產品類,指示拉面的一些屬性??
  • {??
  • private:??
  • ????vector<string>?mFoodName;??
  • ????vector<int>?mPrice;??
  • public:??
  • ????void?add(string?foodName,int?price)??
  • ????{??
  • ????????mFoodName.push_back(foodName);??
  • ????????mPrice.push_back(price);??
  • ????}??
  • ??
  • ????void?show()??
  • ????{??
  • ????????cout<<"food?list:"<<endl;??
  • ????????cout<<"_______________________"<<endl;??
  • ????????for(int?i=0;i<mFoodName.size();++i)??
  • ????????{??
  • ????????????cout<<mFoodName[i]<<"??"<<mPrice[i]<<endl;??
  • ????????}??
  • ????}??
  • ??
  • };??
  • ??
  • class?Builder??//定義抽象的制作類,含有三個制作的環節和一個返回制作出來的產品方法??
  • {??
  • public:??
  • ????virtual?void?BuildCoolDish()?=?0;??
  • ????virtual?void?BuildDrink()?=?0;??
  • ????virtual?void?BuildRice()?=?0;??
  • ????virtual?Food*?GetFood()?=?0;??
  • };??
  • ??
  • ??
  • class?BuilderA:public?Builder??//制作者A,我們假定他做出來的涼菜收20,飲料15,拉面25,總共60元,也就是說收銀員接到60元的套餐就交給A來做??
  • {??
  • public:??
  • ????BuilderA()??
  • ????{??
  • ????????food?=?new?Food();??
  • ????}??
  • ????virtual?void?BuildCoolDish()??
  • ????{??
  • ????????cout<<"涼菜已經制作好,已加入制作工序容器(其實也就是做好了一樣放在了盤子里)"<<endl;??
  • ????????food->add("CoolDish",20);??
  • ????}??
  • ??
  • ????virtual?void?BuildDrink()??
  • ????{??
  • ????????cout<<"飲料制作好了,已加入制作工序容器(放在了杯子里)"<<endl;??
  • ????????food->add("drink",15);??
  • ????}??
  • ??
  • ????virtual?void?BuildRice()??
  • ????{??
  • ????????cout<<"拉面做好了,放棄制作工序容器(放在了盤子里)"<<endl;??
  • ????????food->add("Rice",25);??
  • ????}??
  • ??
  • ????virtual?Food*?GetFood()??
  • ????{??
  • ????????return?food;??
  • ????}??
  • private:??
  • ????Food?*food;??
  • };??
  • ??
  • class?BuilderB:public?Builder??//制作者B,我們假定他做出來的涼菜收30,飲料20,拉面20,總共70元,也就是說收銀員接到70元的套餐就交給B來做??
  • {??
  • public:??
  • ????BuilderB()??
  • ????{??
  • ????????food?=?new?Food();??
  • ????}??
  • ????virtual?void?BuildCoolDish()??
  • ????{??
  • ????????cout<<"涼菜已經制作好,已加入制作工序容器(其實也就是做好了一樣放在了盤子里)"<<endl;??
  • ????????food->add("CoolDish",30);??
  • ????}??
  • ??
  • ????virtual?void?BuildDrink()??
  • ????{??
  • ????????cout<<"飲料制作好了,已加入制作工序容器(放在了杯子里)"<<endl;??
  • ????????food->add("drink",20);??
  • ????}??
  • ??
  • ????virtual?void?BuildRice()??
  • ????{??
  • ????????cout<<"拉面做好了,放棄制作工序容器(放在了盤子里)"<<endl;??
  • ????????food->add("Rice",20);??
  • ????}??
  • ??
  • ????virtual?Food*?GetFood()??
  • ????{??
  • ????????return?food;??
  • ????}??
  • private:??
  • ????Food?*food;??
  • };??
  • ??
  • //定義收銀員??
  • class?FoodManager??
  • {??
  • private:??
  • ????Builder?*builder;??
  • public:??
  • ????FoodManager(){builder?=?NULL;};??
  • ??
  • ????Food*?FoodInfo(char?ch)??
  • ????{??
  • ????????if(ch?==?'A')??
  • ????????????builder?=?new?BuilderA();??
  • ????????else?if(ch?==?'B')??
  • ????????????builder?=?new?BuilderB();??
  • ????????else??
  • ????????????//你還可以加其他套餐;??
  • ????????????;??
  • ????????builder->BuildCoolDish();??
  • ????????builder->BuildDrink();??
  • ????????builder->BuildRice();??
  • ??
  • ????????return?builder->GetFood();??
  • ????}??
  • ??
  • };??
  • ??
  • int?main()??
  • {??
  • ????FoodManager?*p?=?new?FoodManager();??
  • ????char?ch;??
  • ????//客戶到來,輸入需要哪種套餐??
  • ????for(int?i=0;i<5;i++)??
  • ????{??
  • ????????cin>>ch;??
  • ????????p->FoodInfo(ch)->show();??
  • ????????cout<<endl;??
  • ????}??
  • ????system("pause");??
  • ????return?0;??
  • }??
  • class Food //定義產品類,指示拉面的一些屬性 { private:vector<string> mFoodName;vector<int> mPrice; public:void add(string foodName,int price){mFoodName.push_back(foodName);mPrice.push_back(price);}void show(){cout<<"food list:"<<endl;cout<<"_______________________"<<endl;for(int i=0;i<mFoodName.size();++i){cout<<mFoodName[i]<<" "<<mPrice[i]<<endl;}}};class Builder //定義抽象的制作類,含有三個制作的環節和一個返回制作出來的產品方法 { public:virtual void BuildCoolDish() = 0;virtual void BuildDrink() = 0;virtual void BuildRice() = 0;virtual Food* GetFood() = 0; };class BuilderA:public Builder //制作者A,我們假定他做出來的涼菜收20,飲料15,拉面25,總共60元,也就是說收銀員接到60元的套餐就交給A來做 { public:BuilderA(){food = new Food();}virtual void BuildCoolDish(){cout<<"涼菜已經制作好,已加入制作工序容器(其實也就是做好了一樣放在了盤子里)"<<endl;food->add("CoolDish",20);}virtual void BuildDrink(){cout<<"飲料制作好了,已加入制作工序容器(放在了杯子里)"<<endl;food->add("drink",15);}virtual void BuildRice(){cout<<"拉面做好了,放棄制作工序容器(放在了盤子里)"<<endl;food->add("Rice",25);}virtual Food* GetFood(){return food;} private:Food *food; };class BuilderB:public Builder //制作者B,我們假定他做出來的涼菜收30,飲料20,拉面20,總共70元,也就是說收銀員接到70元的套餐就交給B來做 { public:BuilderB(){food = new Food();}virtual void BuildCoolDish(){cout<<"涼菜已經制作好,已加入制作工序容器(其實也就是做好了一樣放在了盤子里)"<<endl;food->add("CoolDish",30);}virtual void BuildDrink(){cout<<"飲料制作好了,已加入制作工序容器(放在了杯子里)"<<endl;food->add("drink",20);}virtual void BuildRice(){cout<<"拉面做好了,放棄制作工序容器(放在了盤子里)"<<endl;food->add("Rice",20);}virtual Food* GetFood(){return food;} private:Food *food; };//定義收銀員 class FoodManager { private:Builder *builder; public:FoodManager(){builder = NULL;};Food* FoodInfo(char ch){if(ch == 'A')builder = new BuilderA();else if(ch == 'B')builder = new BuilderB();else//你還可以加其他套餐;;builder->BuildCoolDish();builder->BuildDrink();builder->BuildRice();return builder->GetFood();}};int main() {FoodManager *p = new FoodManager();char ch;//客戶到來,輸入需要哪種套餐for(int i=0;i<5;i++){cin>>ch;p->FoodInfo(ch)->show();cout<<endl;}system("pause");return 0; }


    這個例子在FoodManager的時候還利用了簡單工廠模式,其實更好的設計可以把FoodManager改寫成單例模式,因為一般一個收銀員在指示其他所有的工作者聽從她的指揮,好了,總結一下建造模式:

    1、建造者模式的使用使得產品的內部表象可以獨立的變化。使用建造者模式可以使客戶端不必知道產品內部組成的
    細節。
    2、每一個B u i l d e r都相對獨立,而與其它的B u i l d e r無關。
    3、可使對構造過程更加精細控制。
    4、將構建代碼和實現代碼分開。
    5、建造者模式的缺點在于難于應付“分步驟構建算法”的需求變動

    ?

    關于建造者模式的標準實例,相信學過C#的都知道有一個stringbuilder 他就是一個利用這種思想設計出來的,在我自己構思的C++庫中我也會用string實作一個stringbuilder出來,到飯點了,閃!

    總結

    以上是生活随笔為你收集整理的设计模式之Builder模式 (C++实现)的全部內容,希望文章能夠幫你解決所遇到的問題。

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

    主站蜘蛛池模板: 欧美日韩大陆 | 国产自在线拍 | 久久久久国色av免费观看性色 | 青青草视频免费 | 91精品国产色综合久久不卡电影 | 久草五月天 | 第一章豪妇荡乳黄淑珍 | 成人精品久久 | 一级精品视频 | 日韩一级欧美一级 | 91极品国产 | www.在线观看av | 四虎福利视频 | 性爱视频日本 | 国产精品69久久久 | 国产av不卡一区二区 | 蛇女欲潮性三级 | 青青视频二区 | 青青草官网| 无码一区二区波多野结衣播放搜索 | 欧美激情亚洲色图 | 亚洲字幕在线观看 | www.欧美成人| 99这里都是精品 | 激情五月综合色婷婷一区二区 | 日韩天堂在线观看 | 亚洲欧美www | 亚洲午夜福利在线观看 | 亚洲一区自拍偷拍 | 亚洲在线免费 | 久久久久国产精品区片区无码 | 欧美亚洲国产一区二区三区 | 91在线公开视频 | 九九热视频精品 | 痴汉电车在线观看 | 午夜爱爱免费视频 | 性生活三级视频 | 久久99精品久久久久久三级 | 男人的天堂av网站 | 美女视频久久 | av在线黄 | 久久久久久国产视频 | heyzo亚洲 | 亚洲视频国产精品 | 欧美a级片视频 | 久久久久久亚洲中文字幕无码 | 国产精品免费电影 | 午夜精品久久久久久久无码 | 亚洲精品乱码久久久久久9色 | 日韩爆操 | 最好看的2018中文2019 | 日韩精品免费一区二区三区竹菊 | 99久久99久久精品国产片果冰 | 爱草在线视频 | 91自啪 | 国产猛男猛女超爽免费视频 | 欧美三日本三级少妇三 | 国产在线观看免费网站 | 国产经典一区 | 男人的天堂va | 色诱视频在线观看 | 欧美精品小视频 | 无码人妻精品一区二区三区99v | 精品视频不卡 | 欧美性色网站 | 特种兵之深入敌后 | 久久久久黄色片 | 中文字幕免费一区 | 亚洲色图视频在线观看 | 一级片中文 | 91资源在线视频 | 亚洲国产精品免费视频 | 亚洲精品一区二区三区新线路 | 777片理伦片在线观看 | 色综合久久久久久久 | 五月香蕉网 | 中文字幕一区二区三区日韩精品 | 黄色a免费| 亚洲老老头同性老头交j | 欧美久久久久久久 | 伊人网色 | 欧美日韩色综合 | 欧美xxxx黑人又粗又长密月 | 伊人黄网| 浮生影视在线观看免费 | 成人午夜毛片 | 成人av免费网站 | 综合网亚洲| 亚洲国产麻豆 | 欧美黄色大片免费看 | 亚洲欧美日韩国产精品 | 超薄肉色丝袜一区二区 | 2021久久 | 日韩v片| 丰满少妇在线观看资源站 | 成人免费视频久久 | 91干干| 国产精品入口夜色视频大尺度 | 九九精品视频在线观看 |