23種設計模式之建造者模式

2022-05-10 23:45:10 字數 1745 閱讀 6192

建造者模式也叫生成器模式, 定義如下:

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

類圖如下:

在建造者模式中, 四個角色如下:

product 產品類: 通常是實現了模板方法模式, 也就是有模板方法和基本方法

builder 抽象建造者: 規範產品的組建, 一般是由子類實現

concretebuilder 具體建造者: 實現抽象類定義的所有方法,並且返回乙個組建好的物件.

director 導演類: 負責安排已有模組的順序, 然後告訴builder開始建造.

先看product類的**, 通常他是乙個組合或繼承產生的類:

抽象建造者**如下:

其中 setpart 方法是零件的配置, 其他的物件, 獲得乙個不同零件,或者不同的裝配順序就可能產生不同的產品

具體建造者**如下:

導演類**:

導演類起到封裝的作用,避免高層模組深入到建造者內部的實現類. 當然, 在建造者模式比較龐大時, 導演類可以有多個

現在又乙個專案,建立不同的汽車, 有賓士的寶馬的, 車有啟動、停止、喇叭聲音、引擎聲音, 不同車有不同的順序, 開始建立, 先使用模板方法模式, 類圖如下

在carmodel中定義了乙個 setsequence 方法, 車輛模型的這幾個動作要如何排布, 是在 arraylist中定義的. 然後run方法根據 sequence定義的順序完成指定的順序動作

carmodel**:

carmodel是這樣設計的, setsequence方法允許客戶自己設定乙個順序, 是先啟動還是先按喇叭, 在子類中實現其基本方法, 然後同過run方法實現順序呼叫

其實現類**就不再占用篇幅

這時有乙個要求, 生產乙個賓士模型,要先發動引擎,再啟動,然後停下來,不需要按喇叭, 建立**如下:

這樣我們就建立了一輛汽車, 但是需求是汽車的執行順序要能夠隨意調整, 我們只滿足了乙個, 還有下乙個,下下個, 那怎麼辦? 我們每次都要寫這些來滿足. 我們要想辦法解決這個問題, 那麼我們可以通過建造者, 通過建造者建立, 類圖如下

其 carbuilder **如下:

實現類**如下

這樣,我們就可以通過乙個導演類,封裝各個順序並返回產品

其中的方法可以新增,可以有很多方法

這樣,再建立的時候就輕鬆多了,直接呼叫乙個方法即可

這不是乙個單純的建造者模式, 其中使用了模板方法模式

優點如下:

封裝性. 使用建造者模式可以是客戶端不必知道產品內部組成的細節

建造者獨立, 容易擴充套件

便於控制細節風險. 由於具體的建造者是獨立的, 因此可以對建造過程逐步細化, 而不對其他的模組產生任何影響

建造者模式的使用場景:

相同的方法,不同的執行順序,產生不同的事件結果時,可以採用建造者模式

多個部件或零件,都可以裝配到乙個物件中,但是產生的執行結果又不相同時,則可以使用

產品非常複雜,或者產品類中的呼叫順序不同產生了不同的效能,這個時候使用建造者模式非常合適

在物件建立過程中也會使用到系統中的一些其他物件,這些物件在產品物件的建立過程中不易得到時,也可以採用建造者模式封裝該物件的建立過程.這種場景只能是乙個補償方法, 因為乙個物件不容易獲得, 而在設計 階段竟然沒有發覺, 而要通過建造者模式柔化建立過程,本身已經違反設計的最初目標

建造者模式關注的是零件型別和裝配工藝(順序), 這是它與工廠方法模式最大不同的地方, 雖然同為建立類模式, 但是注重點不同

建造者模式最主要的功能是基本方法的呼叫順序安排,而工廠方法則重點是建立

23種設計模式之建造者模式

建造模式的本質 分離了物件子元件的單獨構造 有builder來負責 和裝配 由diretor負責 從而可以構造出複雜的物件。這種模式適用於 某個物件的構建過程複雜的情況下使用。由於實現了構建和裝配的解耦。不同的構建器,相同的裝配,也可以做出不同的物件 相同的構建器,不同的裝配順序也可以做出不同的物件...

23種設計模式之建造者模式

主要作用 在使用者不知道物件的建造過程和細節的情況下就可以直接建立複雜的物件。使用者只需要給出指定複雜物件的型別和內容,建造者模式負責按順序建立複雜物件 把內部的建造過程和細節隱藏起來 例子 角色分析 建圖紙 記錄建房的方法,步驟 抽象的建造者 方法 public abstract class bu...

23種設計模式之 建造者模式

又是乙個週三,快要下班了,老大突然拉住我,喜滋滋的告訴我 xx公司很滿意我們做的模型,又簽訂了乙個合同,把賓士 寶馬的車輛模型都交給我們公司製作了,不過這次又額外增加了乙個需求 汽車的啟動 停止 喇叭聲音 引擎聲音都由客戶自己控制,他想什麼順序就什麼順序,這個沒問題吧?又是乙個時間緊,工程量大的專案...