亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

詳解C++設計模式編程中建造者模式的實現

2020-05-23 14:08:24
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了C++設計模式編程中建造者模式的實現,建造者模式將一個復雜對象的構建于它的表現分離,可以減少代碼冗余,需要的朋友可以參考下
 

建造者模式:將一個復雜對象的構建與它的表示分離,使得同樣的構建過程可以創建不同的表示。這是建造者模式的標準表達,不過看著讓人迷惑,什么叫構建和表示的分離?一個對象使用構造函數構造之后不就固定了,只有通過它方法來改變它的屬性嗎?而且還要同樣的構建過程搞出不同的表示,怎么可能呢?多寫幾個構造函數?

其實多寫幾個構造函數,根據不同參數設置對象不同的屬性,也可以達到這樣的效果,只是這樣就非常麻煩了,每次要增加一種表示就要添加一個構造函數,將來構造函數會多得連自己都不記得了,這違背了開放-封閉的原則。

要不就只能設計幾個set函數,每次屬性不一樣了,我就構造一個對象,然后用set函數改變對象的屬性。這樣也可以達到效果。只是代碼就會非常冗余了,每個要用到這個對象的地方,都要寫上好幾句語句,一旦對象有點什么變化,還得到處都改一遍,這樣就很容易出錯,以后別人看著這種神邏輯和神代碼估計也會崩潰了。而且這也違背了依賴倒轉的原則。

于是大神們就開始想了,不能加很多構造函數,也不能直接用一堆set函數,然后發現,有些對象的構建是固定的幾個步驟的,就像一條流水線一樣,任何的產品都是通過每一個固定的步驟拼湊出來的。例如說一部手機,先放主板,再放屏幕,再放電池,再放外殼,貼個膜就能賣幾千了,每次推出新產品,就換個更好的主板,換個大點的屏幕,再整個大容量電池,貼個超牛B的高透膜,又能賣出個新價錢。就是說,這些步驟都沒有變,變的只是每個部分的東西。

這就是大神的厲害之處了,透過現象看本質,基本有變的,有不變的,那敢情好,面向對象的一個重要指導思想就是,封裝隔離變化的,留出不變的。于是他們就用一個Builder類把步驟中的每個部分封裝起來,這個類的主要作用就是生產每個部件,再抽象一下提升高度,這樣就依賴倒轉了,這樣每次只需要添加一個類,這個類還是這幾個部分,只是內部的實現已經不一樣了,這樣就滿足了開放-封閉的原則了。但還是有一個問題,光有Builder類還不行,雖然產品的每個部分都有對應的函數,但是用起來的話,還是跟前面說的set函數一樣,一用就要使用一大堆函數,也就是這變的東西是封裝起來了,但這不變的東西還沒留出來。這時,就添加一個Director類,這個類就是專門規定組裝產品的步驟的,這樣只要告訴Director使用哪個Builder,就能生產出不同的產品,對于客戶端來說,只看到用了Director的一個construct函數,甚是方便。

再反過來看建造者模式的定義,構建指的就是生產一個產品的步驟,表示就是每個產品部分的具體實現,通過Director封裝步驟,通過Builder封裝產品部分的實現,再把他兩隔離開,就能隔離變的,留出不變的供客戶端使用。

C++,設計模式編程,建造者模式

圖中可以看到,Product是必須要知道,沒有抽象,但是這個產品卻可以由不同的部分組合而成。Director里的construct也是固定,沒有抽象出來,如果要更改步驟,也要添加一個函數,或者再添一個Diector,所以建造者模式一般應用于步驟不會發生大的變化,而產品會發生大變化的情況。

常用的場景
C#中的StringBuilder就是一個建造者的例子,但只是一個建造者,還缺一個Director,不能算一個完整的建造者模式。建造者模式一般應用于構建產品的步驟(也可以稱為算法)不變,而每個步驟的具體實現又劇烈變化的情況。

優點
1.隔離了構建的步驟和具體的實現,為產品的具體實現提供了靈活度。

2.封裝和抽象了每個步驟的實現,實現了依賴倒轉原則。

3.封裝了具體的步驟,減少了代碼的冗余。

缺點
1.要求構建產品的步驟(算法)是不能劇烈變化的,最好是不變的,這樣就影響了靈活度。

實例

#include "stdafx.h" #include <stdlib.h> #include <iostream> using namespace std;   //抽象類,用來安排創建人的具體流程,其他類必須遵循這個流程,但是可以自己具體實現 class CPersonBuilder { public:  virtual void BuildHead()=0;  virtual void BuildBody()=0;  virtual void BuildArmLeft()=0;  virtual void BuildArmRight()=0;  virtual void BuildLegLeft()=0;  virtual void BuildLegRight()=0; };   //創建瘦子的類 class CThinPersonBuilder:public CPersonBuilder { public:  CThinPersonBuilder()  {  cout<<"is creating thin person "<<endl<<endl;  }  ~CThinPersonBuilder()  {  cout<<"is finished for thin person"<<endl<<endl;  } public:  void BuildHead()  {  cout<<"BuildHead"<<endl;  }  void BuildBody()  {  cout<<"BuildBody(thin)"<<endl;  }  void BuildArmLeft()  {  cout<<"BuildArmLeft"<<endl;  }  void BuildArmRight()  {  cout<<"BuildArmRight"<<endl;  }  void BuildLegLeft()  {  cout<<"BuildLegLeft"<<endl;  }  void BuildLegRight()  {  cout<<"BuildLegRight"<<endl;  } };  //創建胖子的類 class CFatPersonBuilder:public CPersonBuilder { public:  CFatPersonBuilder()  {  cout<<"is creating fat person"<<endl;  }  ~CFatPersonBuilder()  {  cout<<"is finished for fat person"<<endl;  } public:  void BuildHead()  {  cout<<"BuildHead"<<endl;  }  void BuildBody()  {  cout<<"BuildBody(Fat)"<<endl;  }  void BuildArmLeft()  {  cout<<"BuildArmLeft"<<endl;  }  void BuildArmRight()  {  cout<<"BuildArmRight"<<endl;  }  void BuildLegLeft()  {  cout<<"BuildLegLeft"<<endl;  }  void BuildLegRight()  {  cout<<"BuildLegRight"<<endl;  } };   //指揮者類,用來指揮創建的人是瘦子還是胖子 class CPersonDirector { public:  CPersonDirector(CPersonBuilder *p)  {  this->m_p=p;  }  const void CreatePerson(void) const  {  m_p->BuildHead();  m_p->BuildBody();  m_p->BuildArmLeft();  m_p->BuildArmRight();  m_p->BuildLegLeft();  m_p->BuildLegRight();  } private:  CPersonBuilder *m_p; };        int _tmain(int argc, _TCHAR* argv[]) {  cout<<"---------建造者模式測試案例------------------------"<<endl<<endl;    CThinPersonBuilder *p_tp=new CThinPersonBuilder();  CPersonDirector *p_dtp=new CPersonDirector(p_tp);  p_dtp->CreatePerson();  delete p_tp;  delete p_dtp;  p_tp=NULL;  p_dtp=NULL;  cout<<endl<<endl;   CFatPersonBuilder *p_fp=new CFatPersonBuilder();  CPersonDirector *p_dfp=new CPersonDirector(p_fp);  p_dfp->CreatePerson();  delete p_fp;  delete p_dfp;  p_fp=NULL;  p_dfp=NULL;  system("pause");  return 0; } 

C++,設計模式編程,建造者模式

 

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产在线999| 国产99久久精品一区二区| 国产精品视频一| 亚洲精品日产aⅴ| 亚洲精品xxx| 亚洲女同精品视频| 岛国精品视频在线播放| 亚洲影院色无极综合| 在线观看不卡av| 国产精品久久一区主播| 久久在线视频在线| 欧美猛少妇色xxxxx| 8090理伦午夜在线电影| 欧美性20hd另类| 日韩成人激情影院| 色偷偷噜噜噜亚洲男人的天堂| 亚洲在线免费视频| 亚洲欧美综合精品久久成人| 疯狂做受xxxx欧美肥白少妇| 中文字幕视频在线免费欧美日韩综合在线看| 国产精品视频最多的网站| 欧美在线激情网| 在线日韩精品视频| 久久亚洲精品小早川怜子66| 国产一区二区视频在线观看| 成人黄在线观看| 久久av在线播放| 三级精品视频久久久久| 国产成人在线视频| 日韩电影免费观看在线观看| 国产欧美日韩综合精品| 中文字幕日韩av| 国产日韩欧美自拍| 亚洲女性裸体视频| 欧日韩不卡在线视频| 亚洲国产日韩欧美综合久久| 这里只有精品视频在线| 欧美理论片在线观看| 国产亚洲一级高清| www亚洲精品| 欧美激情a∨在线视频播放| 日本欧美在线视频| 国产精品扒开腿爽爽爽视频| 日本最新高清不卡中文字幕| 欧美一区二粉嫩精品国产一线天| 亚洲成人激情在线| 日韩在线视频免费观看| 久久久国产视频91| 日韩欧美国产免费播放| 国产精品女主播| 久久人人看视频| 操人视频在线观看欧美| 欧美裸身视频免费观看| 奇米影视亚洲狠狠色| 日韩av综合网站| 18性欧美xxxⅹ性满足| 2021久久精品国产99国产精品| 国产mv免费观看入口亚洲| 高清一区二区三区四区五区| 欧美寡妇偷汉性猛交| 91成人精品网站| 久久久久久久久久久网站| 成人在线激情视频| 日韩电影免费观看在线| 成人妇女免费播放久久久| 国产在线精品成人一区二区三区| 亚洲白拍色综合图区| 色婷婷av一区二区三区久久| 在线观看不卡av| 亚洲精品视频网上网址在线观看| 中文字幕亚洲在线| 国产欧美日韩最新| 韩国视频理论视频久久| 国产91ⅴ在线精品免费观看| 国外成人在线直播| 98精品国产自产在线观看| 亚洲国产精品视频在线观看| 精品国产一区二区三区久久狼5月| 亚洲成色777777在线观看影院| 亚洲va男人天堂| 久久精品国产久精国产思思| 亚洲免费成人av电影| 欧美色另类天堂2015| 亚洲成成品网站| 久久夜精品香蕉| 91产国在线观看动作片喷水| 日韩亚洲成人av在线| 日本欧美一级片| 欧美日韩色婷婷| 亚洲自拍偷拍在线| 粉嫩av一区二区三区免费野| 国产99久久精品一区二区 夜夜躁日日躁| 精品亚洲一区二区三区四区五区| 亚洲国产精品99久久| 色在人av网站天堂精品| 日韩欧美在线免费| 九九久久久久99精品| 久久不射热爱视频精品| 久久精品这里热有精品| 韩日精品中文字幕| 中文字幕日韩综合av| 国产国语刺激对白av不卡| 日韩电影中文字幕在线观看| 欧美日韩精品在线播放| 96sao精品视频在线观看| 57pao国产成人免费| 中文字幕日韩电影| 国产91精品视频在线观看| 国产精品一区久久| 国产91精品久久久久久久| 狠狠爱在线视频一区| 久久av红桃一区二区小说| 国产精品678| 亚洲一区二区三区四区在线播放| 国产视频精品xxxx| 一本大道香蕉久在线播放29| 精品国产老师黑色丝袜高跟鞋| 奇米4444一区二区三区| 色哟哟网站入口亚洲精品| 国产精品久久久久久久app| 亚洲天堂av在线免费| 久久久这里只有精品视频| 91在线|亚洲| 欧美电影免费观看| 97国产真实伦对白精彩视频8| 国产免费一区二区三区香蕉精| 91在线观看免费高清完整版在线观看| 国产成人久久久精品一区| 国产精品成人国产乱一区| 91国产视频在线| 欧美在线亚洲在线| 精品亚洲夜色av98在线观看| 亚洲视频在线观看网站| 日韩av第一页| 日韩一级裸体免费视频| 日韩美女av在线免费观看| 成人欧美一区二区三区在线| 日本精品视频网站| 日韩av免费在线| 日韩精品极品视频免费观看| 奇米一区二区三区四区久久| 久久香蕉频线观| 91精品综合久久久久久五月天| 国产美女高潮久久白浆| 国产成人精品综合久久久| 久久精品亚洲国产| 岛国视频午夜一区免费在线观看| 国内精品小视频| 91久久国产精品91久久性色| 91九色单男在线观看| 国产91九色视频| 欧美夫妻性视频| 日韩国产高清污视频在线观看| 国产高清在线不卡| 欧美丰满老妇厨房牲生活| 精品中文字幕久久久久久| 欧美大片欧美激情性色a∨久久| 国产精品美女无圣光视频| 91tv亚洲精品香蕉国产一区7ujn| 这里只有精品在线播放| 国产亚洲a∨片在线观看| 久久99热精品| 日韩成人av网址| 日韩av大片免费看|