設計模式那點事 建造者模式

2021-09-08 22:47:50 字數 2244 閱讀 6030

概念

建造者模式(

builder

)。將乙個複雜物件的建立與它的表示分離,使得相同的構建過程能夠建立不同的表示。

建造者模式能夠將乙個產品的內部表象與產品的生成過程切割開來,從而能夠使乙個建造過程生成具有不同的內部表象的產品物件。

我們僅僅需指定須要建造的型別就能夠得到它們,而詳細建造的過程和細節就不需知道了。

樣例

乙個鮮活簡單的樣例總能讓人輕鬆地理解晦澀的概念。我們來看看乙個關於構建汽車的建造者模式。

我們知道。汽車一般由輪胎,引擎和車身組成。就像寶馬(bmw)。法拉利(ferrali)和賓士(benz)三輛汽車,它們也是由這三種東西組成的,僅僅只是構成模組**不同。

對於它們來說。儘管組成模組**不同,可是構建汽車都包括這三種東西,是一種公共操作。

於是。能夠建立乙個抽象父親汽車構建類(carbuilder),宣告三個構建函式virtual void buildwheel等的介面。

然後建立三個詳細汽車構建子類:bmwbuilder,ferralibuilder和benzbuilder。用於詳細汽車的構建,並提供返回詳細汽車產品物件的介面。

它們分別繼承於carbuilder,每乙個子類實現父類模組的個性化構建。

然後再定義乙個構建汽車指導者cardirector。用於控制汽車建造過程,隔離使用者與建造過程的關聯。最後定義乙個產品類product,用於顯示終於的生成汽車產品。

角色

1、建造者(

builder

):為建立乙個產品物件的各個部件指定抽象介面,如

carbuilder

。2、詳細建造者(

concretebuilder

):實現

builder

的介面以構造和裝配該產品的各個部件,定義並明白它所建立的表示,提供乙個獲取汽車成品物件的介面,如

bmwbilder

。3、指示領導者(

director

):構造乙個使用

builder

介面的物件,用於控制建造過程,隔離使用者與建造過程的關聯,如cardirector。

4、詳細產品(

product

):表示被構造的複雜物件。如

bmw汽車。

uml

//詳細產品類

class product

void show()

~cardirector() }

void createcar() };

int main()

else if(itag==2)

else if(itag==3)

cout<

發散

我們知道實現c++的多型有三種方法:函式過載,模板函式和虛函式。

虛函式實現的多型稱為動態多型。上面**有下面特點:

1、子類的物件轉換給父類的物件如

carbuilder* cb= new bmwbuilder

,我們稱為向上轉型。

它是安全的,自己主動完畢,而且會丟失子型別的資訊;

2、為了解決子型別資訊丟失的問題(子類物件轉換給父類),父類必須實現了乙個虛函式

buildwheel

。3、子類有全然同樣的

buildwheel

函式,覆蓋重寫父類的虛函式

buildwheel

,這樣便能實現動態多型了(否則僅僅能用指標或引用了)。

應用場景

1、當建立一些複雜物件,這些物件內部構建間的建造順序一般是穩定的。但物件內部的構建面臨著複雜的變化;

2、當構造過程必須同意被構造的物件有不同表示時。

長處

使得建造**與表示**分離,因為建造者隱藏了該產品是怎樣組裝的,所以若須要改變乙個產品的內部表示。僅僅須要再定義乙個詳細的建造者就能夠了,減少耦合性。

設計模式 建造者模式

在gof的23種設計模式中對builder pattern的定義是 將乙個複雜物件的構建與它的表示分離,使得同樣的構建過程可以建立不同的表示。從程式角度來說,就是在基類定義某種事物建立的過程或業務流程,在子類進行重寫或是使用基類方法。這樣建立出來的例項不會因為過程或流程的丟失而使業務失敗。舉例來說,...

設計模式建造者模式

今天看了乙個設計模式。總結下,以免忘了。如何引入建造者模式的呢?作者舉了個例子。建造小人。當然需要 頭,左手,右手,左腳,右腳,軀幹。建造的過程使用 使用類裡面的方法就行了。但是如果需要乙個胖的小人,乙個瘦的小人呢?就需要重新構造乙個胖人類,乙個瘦人類。當然 使用者還需要自己處理構造的過程。這樣 就...

設計模式 建造者模式

定義 將乙個複雜的物件的構建與它的表示分離,是的同樣的構建過程可以建立不同的表示。包括的要素 1 產品類 2 抽象建造者或者介面 3 建造者 4 導演類 建造者模式的優點 首先,建造者模式的封裝很好,使用建造者模式可以有效地封裝變化,注意在使用建造者模式的場景中,一般產品類和建造者介面是比較穩定的,...