建造者模式的定義 建造者模式也叫生成器模式, 定義如下: 將一個複雜對象的構建與它的表示分離, 使得同樣的構建過程可以創建不同的表示 類圖如下: 在建造者模式中, 四個角色如下: 先看Product類的代碼, 通常他是一個組合或繼承產生的類: 抽象建造者代碼如下: 其中 setPart 方法是零件的 ...
建造者模式的定義
建造者模式也叫生成器模式, 定義如下:
將一個複雜對象的構建與它的表示分離, 使得同樣的構建過程可以創建不同的表示
類圖如下:
在建造者模式中, 四個角色如下:
- Product 產品類: 通常是實現了模板方法模式, 也就是有模板方法和基本方法
- Builder 抽象建造者: 規範產品的組建, 一般是由子類實現
- ConcreteBuilder 具體建造者: 實現抽象類定義的所有方法,並且返回一個組建好的對象.
- Director 導演類: 負責安排已有模塊的順序, 然後告訴Builder開始建造.
先看Product類的代碼, 通常他是一個組合或繼承產生的類:
抽象建造者代碼如下:
其中 setPart 方法是零件的配置, 其他的對象, 獲得一個不同零件,或者不同的裝配順序就可能產生不同的產品
具體建造者代碼如下:
導演類代碼:
導演類起到封裝的作用,避免高層模塊深入到建造者內部的實現類. 當然, 在建造者模式比較龐大時, 導演類可以有多個
建造者模式分析
現在又一個項目,創建不同的汽車, 有賓士的寶馬的, 車有啟動、停止、喇叭聲音、引擎聲音, 不同車有不同的順序, 開始創建, 先使用模板方法模式, 類圖如下
在CarModel中定義了一個 setSequence 方法, 車輛模型的這幾個動作要如何排布, 是在 ArrayList中定義的. 然後run方法根據 sequence定義的順序完成指定的順序動作
CarModel代碼:
CarModel是這樣設計的, setSequence方法允許客戶自己設置一個順序, 是先啟動還是先按喇叭, 在子類中實現其基本方法, 然後同過run方法實現順序調用
其實現類代碼就不再占用篇幅
這時有一個要求, 生產一個賓士模型,要先發動引擎,再啟動,然後停下來,不需要按喇叭, 創建代碼如下:
這樣我們就創建了一輛汽車, 但是需求是汽車的執行順序要能夠隨意調整, 我們只滿足了一個, 還有下一個,下下個, 那怎麼辦? 我們每次都要寫這些來滿足. 我們要想辦法解決這個問題, 那麼我們可以通過建造者, 通過建造者創建, 類圖如下
其 CarBuilder 代碼如下:
實現類代碼如下
這樣,我們就可以通過一個導演類,封裝各個順序並返回產品
其中的方法可以添加,可以有很多方法
這樣,再創建的時候就輕鬆多了,直接調用一個方法即可
這不是一個單純的建造者模式, 其中使用了模板方法模式
建造者模式的應用
優點如下:
- 封裝性. 使用建造者模式可以是客戶端不必知道產品內部組成的細節
- 建造者獨立, 容易擴展
- 便於控制細節風險. 由於具體的建造者是獨立的, 因此可以對建造過程逐步細化, 而不對其他的模塊產生任何影響
建造者模式的使用場景:
- 相同的方法,不同的執行順序,產生不同的事件結果時,可以採用建造者模式
- 多個部件或零件,都可以裝配到一個對象中,但是產生的運行結果又不相同時,則可以使用
- 產品非常複雜,或者產品類中的調用順序不同產生了不同的效能,這個時候使用建造者模式非常合適
- 在對象創建過程中也會使用到系統中的一些其他對象,這些對象在產品對象的創建過程中不易得到時,也可以採用建造者模式封裝該對象的創建過程.這種場景只能是一個補償方法, 因為一個對象不容易獲得, 而在設計 階段竟然沒有發覺, 而要通過建造者模式柔化創建過程,本身已經違反設計的最初目標
建造者模式關註的是零件類型和裝配工藝(順序), 這是它與工廠方法模式最大不同的地方, 雖然同為創建類模式, 但是註重點不同
建造者模式最主要的功能是基本方法的調用順序安排,而工廠方法則重點是創建