詳解C++設計形式編程中建造者形式的完成。本站提示廣大學習愛好者:(詳解C++設計形式編程中建造者形式的完成)文章只能為提供參考,不一定能成為您想要的結果。以下是詳解C++設計形式編程中建造者形式的完成正文
建造者形式:將一個龐雜對象的構建與它的表現分別,使得異樣的構建進程可以創立分歧的表現。這是建造者形式的尺度表達,不外看著讓人困惑,甚麼叫構建和表現的分別?一個對象應用結構函數結構以後不就固定了,只要經由過程它辦法來轉變它的屬性嗎?並且還要異樣的構建進程弄出分歧的表現,怎樣能夠呢?多寫幾個結構函數?
其實多寫幾個結構函數,依據分歧參數設置對象分歧的屬性,也能夠到達如許的後果,只是如許就異常費事了,每主要增長一種表現就要添加一個結構函數,未來結構函數會多得連本身都不記得了,這違反了開放-關閉的准繩。
要不就只能設計幾個set函數,每次屬性紛歧樣了,我就結構一個對象,然後用set函數轉變對象的屬性。如許也能夠到達後果。只是代碼就會異常冗余了,每一個要用到這個對象的處所,都要寫上好幾句語句,一旦對象有點甚麼變更,還獲得處都改一遍,如許就很輕易失足,今後他人看著這類神邏輯和神代碼估量也會瓦解了。並且這也違反了依附倒轉的准繩。
因而年夜神們就開端想了,不克不及加許多結構函數,也不克不及直接用一堆set函數,然後發明,有些對象的構建是固定的幾個步調的,就像一條流水線一樣,任何的產物都是經由過程每個固定的步調拼集出來的。例如說一部手機,先放主板,再放屏幕,再放電池,再放外殼,貼個膜就可以賣幾千了,每次推出新產物,就換個更好的主板,換個年夜點的屏幕,再全部年夜容量電池,貼個超牛B的高透膜,又能賣出個新價格。就是說,這些步調都沒有變,變的只是每一個部門的器械。
這就是年夜神的凶猛的地方了,透過景象看實質,根本有變的,有不變的,那敢情好,面向對象的一個主要指點思惟就是,封裝隔離變更的,留出不變的。因而他們就用一個Builder類把步調中的每一個部門封裝起來,這個類的重要感化就是臨盆每一個部件,再籠統一下晉升高度,如許就依附倒轉了,如許每次只須要添加一個類,這個類照樣這幾個部門,只是外部的完成曾經紛歧樣了,如許就知足了開放-關閉的准繩了。但照樣有一個成績,光有Builder類還不可,固然產物的每一個部門都有對應的函數,然則用起來的話,照樣跟後面說的set函數一樣,一用就要應用一年夜堆函數,也就是這變的器械是封裝起來了,但這不變的器械還沒留出來。這時候,就添加一個Director類,這個類就是專門劃定組裝產物的步調的,如許只需告知Director應用哪一個Builder,就可以臨盆出分歧的產物,關於客戶端來講,只看到用了Director的一個construct函數,甚是便利。
再反過去看建造者形式的界說,構建指的就是臨盆一個產物的步調,表現就是每一個產物部門的詳細完成,經由過程Director封裝步調,經由過程Builder封裝產物部門的完成,再把他兩隔分開,就可以隔離變的,留出不變的供客戶端應用。
圖中可以看到,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; }