建造者模式

2022-06-28 12:18:10 字數 2848 閱讀 5495

建造者模式是一種較為複雜的建立型模式。

建造者模式概述

軟體系統中有一些複雜的物件,它們擁有多個組成部分。比如一輛汽車,它包括車輪、方向盤、發動機等多種部件。簡單來說,複雜物件就是指那些包含多個成員變數的物件。對於大多數使用者而言,並不知道這些部件的裝配細節,也幾乎不會使用單獨某個部件,而是使用一輛完整的汽車。

如何將這些部件組裝成一輛完整的汽車並返回給使用者,這是建造者模式需要解決的問題。建造者模式可以將部件本身和它們的組裝過程分開,關注如何一步一步地建立乙個包含多個組成部分的複雜物件,使用者只需要指定複雜物件的型別即可得到該物件,而無須知道其內部的具體構造細節。

定義:將乙個複雜物件的構建與它的表示分離,使得同樣的構建過程可以建立不同的表示。

建造者模式是一種物件建立型模式,它將客戶端與包含多個部件的複雜物件的建立過程分離,客戶端無須知道複雜物件的內部組成部分與裝配方式,只需要知道所需建造者的型別即可。建造者模式關注如何一步一步地建立乙個複雜物件,不同的建造者定義了不同的建立過程。

建造者模式結構與實現

建造者模式結構

建造者模式的結構如下圖:

由圖可知,建造者模式包含以下4個角色:

建造者模式實現

乙個典型的複雜物件類的**例項如下:

public class product
在抽象建造者類中定義了產品的建立方法和返回方法,典型**如下:

public abstract class builder 

}

在具體建造者中實現了buildpartx方法,通過呼叫product的setpartx()方法可以給產品物件的成員變數設值,不同的具體建造者在實現buildpartx()方法時有所區別。而這些對於客戶端來說都無須關心,客戶端只需知道具體建造者型別即可。典型的具體建造者**如下:

public class concretebuilder1 extends builder 

public void buildpartb()

public void buildpartc()

}

director有兩個作用:一方面它隔離了客戶端與建立過程;另一方面,它控制產品物件的建立過程,包括某個buildpartx()方法是否被呼叫以及多個buildpartx()方法呼叫的先後次序等。指揮者針對抽象建造者程式設計,客戶端只需要知道具體建造者的型別便可通過指揮者類呼叫建造者的相關方法,返回乙個完整的產品物件。例如乙個客戶去購買電腦,電腦銷售人員相當於指揮者,只要客戶確定電腦的型別,電腦銷售人員可以通知電腦組裝人員給客戶裝一台電腦。指揮者類的示例**如下:

public class director 

public void setbuilder(builder builder)

//產品構建方法

public product construct()

}

客戶端**片段如下:

...

builder builder = new concretebuilder1();//可通過配置檔案實現

director director = new director(builder);

product product = director.construct();

...

可以通過配置檔案來儲存具體建造者類concretebuilder1的類名,使得在更換或新增新的建造者時無須修改源**,只需將新增具體角色建造者作為抽象角色建造者的子類,然後修改配置檔案,完全符合開閉原則。

指揮者類的深入討論

簡單的指揮者類(director)用於指導具體建造者如何構建產品,它按一定次序呼叫builder的buildpartx()方法,控制呼叫的先後次序,並向客戶端返回乙個完整的產品物件。下面討論幾種director的變化形式。

建造者模式優/缺點與適用環境

建造者模式的核心在於如何一步步構建乙個包含多個組成部件的完整物件,使用相同的構建過程構建不同的產品。在軟體開發中,如果需要建立複雜物件並希望系統具備很好的靈活性和可擴充套件性可以考慮使用建造者模式。

優點

客戶端不必知道產品內部組成的細節,將產品本身與產品的建立過程解耦,使得相同的建立過程可以建立不同的產品物件。

每乙個具體建造者都相對獨立,而與其他的具體建造者無關,因此可以很方便地替換具體建造者或增加新的具體建造者,使用者使用不同的具體建造者即可得到不同的產品物件。由於指揮者類針對抽象建造者程式設計,增加新的具體建造者無須修改原有類庫的**,系統擴充套件方便,符合開閉原則。

可以更加精細地控制產品的建立過程。將複雜產品的建立步驟分解在不同的方法中,使得建立過程更加清晰,也更方便使用程式來控制建立過程。

缺點

建造者模式所建立的產品一般具有較多的共同點,其組成部分相似,如果產品之間的差異性很大,例如很多組成部分都不相同,不適合使用建造者模式,因此使用範圍受到一定限制。

如果產品的內部變化複雜,可能會導致需要定義很多具體建造者類來實現這種變化,導致系統變得很龐大,增加系統的理解難度和執行成本。

適用環境

需要生成的產品物件有複雜的內部結構,這些產品物件通常包含多個成員變數。

需要生成的產品物件的屬性相互依賴,需要指定其生成順序。

物件的建立過程獨立於建立該物件的類。在建造者模式中通過引入指揮者類將建立過程封裝在指揮者類中,而不在建造者類和客戶類中。

隔離複雜物件的建立和使用,並使得相同的建立過程可以建立不同的產品。

建造者模式

1.定義 將乙個複雜物件的構建與它的表示分離,使得同樣的構建過程可以建立不同的表示。2.uml 類圖 結構 該結構 演示了複雜物件被一步一步建立的建造者模式。builder pattern structural example using system using system.collection...

建造者模式

軟體領域中的設計模式為開發人員提供了一種使用專家設計經驗的有效途徑。設計模式中運用了物件導向程式設計語言的重要特性 封裝 繼承 多型,真正領悟設計模式的精髓是可能乙個漫長的過程,需要大量實踐經驗的積累。最近看設計模式的書,對於每個模式,用c 寫了個小例子,加深一下理解。主要參考 大話設計模式 和 設...

建造者模式

建造者模式將複雜物件的構建和它的表示分離,使同樣的構建過程能夠構建出不同的表示。以乙個建造小人為例子,可以建造2種小人,胖子和瘦子 include using namespace std class builder 抽象建造者類 class buildthinman public builder 瘦...