程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> 詳解C++設計形式編程中建造者形式的完成

詳解C++設計形式編程中建造者形式的完成

編輯:關於C++

詳解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; 
} 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved