日韩性视频-久久久蜜桃-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++实现)的全部內容,希望文章能夠幫你解決所遇到的問題。

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

    主站蜘蛛池模板: 天堂网一区二区 | 亚洲九九九 | 国产成人在线观看免费 | 777亚洲 | 亚洲成熟毛多妇女av毛片 | 无码视频一区二区三区 | 精品久久久久久中文字幕人妻最新 | jzzijzzij亚洲成熟少妇在线观看 久久久精品人妻一区二区三区 | 精品中文字幕一区二区三区 | 国产成人在线视频观看 | xxxx视频在线 | 求欧美精品网址 | 精品乱码一区二区三区 | 欧美色图俺去了 | 一本大道av | 午夜精品毛片 | 欧美日韩免费高清一区色橹橹 | 久久久久亚洲AV成人无码国产 | 欧洲视频一区二区三区 | 18禁一区二区三区 | 超碰中文字幕 | 欧美黄色免费在线观看 | 写真福利片hd在线播放 | 色就色综合 | 欧美亚洲激情视频 | 欧美成人黄色网 | 禁网站在线观看免费视频 | 琪琪免费视频 | 国产男人搡女人免费视频 | 精品欧美一区二区久久久 | 日韩成人一级片 | jizz欧美大全 | 91成人在线观看喷潮动漫 | 国产综合久久久久久鬼色 | 午夜激情久久 | chinese国产精品 | 夜夜久久 | 色射影院| 欧美日韩精品二区 | 国产一级二级视频 | 在线xxxxx| 欧美一区二区免费电影 | 男人舔女人下部高潮全视频 | 九一精品一区 | 久久久夜精品 | 超碰97人人在线 | 国产女人水真多18毛片18精品 | 久久一区二区三 | 又骚又黄的视频 | 手机在线看片国产 | 97超碰人人看 | 亚洲毛片一级 | 老师的肉丝玉足夹茎 | 久久精品欧美日韩 | 日韩免费精品视频 | 成人av在线电影 | 国产无毛av | 亚洲网站在线播放 | 国产一级一片免费播放 | 精品少妇久久 | 天天操天天操天天射 | 亚洲一区二区三区无码久久 | 亚洲天堂2013| tube极品少妇videos | 亚洲欧美日韩色 | 欧美 日韩 综合 | 中文av网 | 在线免费h| 日韩av在线免费 | 国产精品无码一区 | 亚洲视频天天射 | 免费一级片网址 | a级小视频 | 97超碰成人 | 亚洲日批视频 | 美女精品久久久 | 国产精品无码av在线有声小说 | 日日草草| 最近国语视频在线观看免费播放 | 高h教授1v1h喂奶 | www男人的天堂 | 国产视频一区在线播放 | 久久天天躁狠狠躁夜夜躁 | 日韩三级黄色片 | 久久性生活视频 | 国产美女永久免费无遮挡 | 男人天堂五月天 | 蜜桃av噜噜一区二区三区 | 伊人干综合| 青青草娱乐视频 | 成人一区二区三区在线观看 | 67194av | 久插网| 黑森林福利视频导航 | 狠狠干2023| 亚洲久久天堂 | 久久成人国产精品 | av在线电影网| 国产噜噜噜噜久久久久久久久 |