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