軟體設計模式修煉 建造者模式

2022-01-10 07:05:47 字數 2842 閱讀 7655

建造者模式是最複雜的建立型模式,它將客戶端與包含多個組成部分的複雜物件的建立過程分離,客戶端無須知道複雜物件的內部組成部分與裝配部分,只需知道建造者的型別即可。

建造者模式用於建立乙個包含對個組成部分的複雜物件,可以返回乙個完整的產品物件給使用者。使用者無須知道建立過程和內部細節,只需直接使用建立好的完整物件即可。比如汽車擁有車輪、方向盤、傳送機等各種部件,使用者幾乎不會單獨使用某個部件,而是使用一輛完整的汽車。軟體開發中也存在類似汽車一樣的複雜物件,它們擁有一系列成員屬性,而且可能存在一些限制條件。

將乙個複雜物件的構建與它的表示分離,使得同樣的構建過程可以建立不同的表示。建造者模式是一步一步建立乙個複雜物件,允許使用者通過指定複雜物件的型別和內容構建它們,使用者不需要知道內部具體構建細節。

builder(抽象建造者)

為建立product物件的各個部件指定抽象介面,方法buildpartx()用於建立複雜物件的各個部件;另乙個方法getresult()用於返回複雜物件。

concretebuilder(具體建造者)

具體建造者實現builder介面,實現各部件的構造和裝配方法,定義並明確它所建立的複雜物件,也可以提供乙個方法返回建立好的複雜產品物件。

product(產品角色)

產品角色是被構建的複雜物件,包含多個組成部件,具體建造者建立該產品的內部表示並定義它的裝配過程。

director(指揮者)

負責安排複雜物件的建造次序,指揮者與抽象建造者之間存在關聯關係,可以在其construct()建造方法中呼叫建造者物件的部件構造與裝配方法,完成複雜物件的建造。客戶端只需與指揮者進行互動,在客戶端確定建造者的型別,並例項化具體建造者物件(也可通過配置檔案和反射機制),然後通過指揮者類的建構函式或者set方法將該物件傳入指揮者類中。

例項說明

**是乙個複雜物件,一般包含主食(如漢堡、雞肉卷等)和飲料(如果汁、可樂)等組成部分。不同**有不同的組成部分,kfc服務員根據顧客需求,一步一步裝填這些組成部分,構造乙份完整的**,然後返回給顧客。

例項**及解釋

產品類meal

**meal是複雜產品物件,它包括兩個成員屬性food和drink,其中food表示主食,drink表示飲料,meal中還包括成員屬性的getter方法和setter方法。

public class meal 

public void setdrink(string drink)

public string getfood()

public void setfood(string food)

}

抽象建造者類mealbuilder(**建造者類)

mealbuilder是**建造者,它是乙個抽象類,宣告了抽象的部件組裝方法buildfood()和builddrink(),在mealbuilder中定義meal型別的物件meal,提供工廠方法getmeal()用於返回meal物件。

public abstract class mealbuilder 

}

具體建造者類submealbuildera(a**建造者類)

submealbuildera是具體建造者類,用於建立a**,它是抽象建造者類的子類,實現了抽象建造者類中宣告的部件的組裝方法。

public class submealbuildera extends mealbuilder 

@override

public void builddrink()

}

具體建造者類submealbuilderb(b**建造者類)

public class submealbuilderb extends mealbuilder 

@override

public void builddrink()

}

指揮者類kfcwaiter(服務員類)

kfcwaiter類是指揮者類,在kfc**製作過程中相當於kfc服務員,客戶端指定具體建造者型別,在其construct()方法中呼叫指定建造者物件的部件組裝方法和工廠方法。

public class kfcwaiter 

public meal construct()

}

xml操作工具類

public class xmlutil 

}

配置檔案

<?xml version="1.0" encoding="utf-8" ?>

submealbuildera

測試類

public class test 

}

結果分析

如果在配置檔案將節點中內容設定為 submealbuildera,則輸出結果如下:

如果在配置檔案將節點中內容設定為 submealbuilderb,則輸出結果如下:

更換具體建造者無須修改源**,只修改配置檔案即可。如果需要增加新的具體建造者,只需增加乙個新的具體建造者類繼承抽象建造者類,再實現其中宣告的抽象部件組裝方法,修改配置檔案,即可使用新的具體建造者構造新的型別的**,系統具有良好的靈活性和可擴充套件性,符合開閉原則的要求。

軟體設計模式 建造者模式

建造者模式的定義將乙個複雜物件的構建與它的表示分離,使得同樣的構建過程可以建立不同的表示 dp 大話設計模式 舉了乙個很好的例子 建造小人,一共需建造6個部分,頭部 身體 左右手 左右腳。與工廠模式不同,建造者模式是在導向者的控制下一步一步構造產品的。建造小人就是在控制下一步步構造出來的 p 設計方...

軟體設計模式修煉 單例模式

通過單例模式可以保證系統中乙個類只有乙個例項而且該例項易於被外界訪問,從而方便對例項個數的控制並節約系統資源。如果希望在系統中某個類的物件只能存在乙個,單例模式是最好的解決辦法。對系統中某些類來說,只有乙個例項很重要,例如,乙個系統只能有乙個視窗管理器或檔案系統。因此確保系統中某個物件的唯一性即乙個...

設計模式 建造者模式

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