設計模式 —— 建造者模式

一.什麼是構建者模式:
將一個複雜的對象的構建與它的表示分離,使得一樣的構建過程能夠建立不一樣的表示。建立者模式隱藏了
複雜對象的建立過程,它把複雜對象的建立過程加以抽象,經過子類繼承或者重載的方式,動態的建立具
有複合屬性的對象。測試

二.適用場景:
一、隔離複雜對象的建立和使用,相同的方法,不一樣執行順序,產生不一樣事件結果
二、多個部件均可以裝配到一個對象中,但產生的運行結果不相同
三、產品類很是複雜或者產品類由於調用順序不一樣而產生不一樣做用
四、初始化一個對象時,參數過多,或者不少參數具備默認值
五、不適合建立差別性很大的產品類產品內部變化複雜,會致使須要定義不少具體建造者類實現變化,
增長項目中類的數量,增長系統的理解難度和運行成本
六、須要生成的產品對象有複雜的內部結構,這些產品對象具有共性ui

三.主要做用:
在用戶不知道對象的建造過程和細節的狀況下就能夠直接建立複雜的對象。
用戶只須要給出指定複雜對象的類型和內容;
建造者模式負責按順序建立複雜對象(把內部的建造過程和細節隱藏起來)this

四.解決的問題:
方便用戶建立複雜的對象(不須要知道實現過程)
代碼複用性 & 封裝性(將對象構建過程和細節進行封裝 & 複用)spa

五.優缺點:
優勢:
使用建造者模式能夠使客戶端沒必要知道產品內部組成的細節。
具體的建造者類之間是相互獨立的,這有利於系統的擴展。
具體的建造者相互獨立,所以能夠對建造的過程逐步細化,而不會對其餘模塊產生任何影響。code

缺點:
建造者模式所建立的產品通常具備較多的共同點,其組成部分類似;若是產品之間的差別性很大,
則不適合使用建造者模式,所以其使用範圍受到必定的限制。若是產品的內部變化複雜,可能會
致使須要定義不少具體建造者類來實現這種變化,致使系統變得很龐大。對象

六.建造者模式與抽象工廠模式的比較:
一、與抽象工廠模式相比,建造者模式返回一個組裝好的完整產品,而抽象工廠模式返回一系列相關
的產品,這些產品位於不一樣的產品等級結構,構成了一個產品族。
二、在抽象工廠模式中,客戶端實例化工廠類,而後調用工廠方法獲取所需產品對象,而在建造者模
式中,客戶端能夠不直接調用建造者的相關方法,而是經過指揮者類來指導如何生成對象,包括
對象的組裝過程和建造步驟,它側重於一步步構造一個複雜對象,返回一個完整的對象 。
三、若是將抽象工廠模式當作汽車配件生產工廠,生產一個產品族的產品,那麼建造者模式就是一個
汽車組裝工廠,經過對部件的組裝能夠返回一輛完整的汽車blog

七.例子:繼承

//非建造者模式的產品類:
public
class Computer { private String cpu; private String screen; private String memory; private String mainboard; public Computer(String cpu, String screen, String memory, String mainboard) { this.cpu = cpu; this.screen = screen; this.memory = memory; this.mainboard = mainboard; } }
//建造者模式的產品類:
public
class NewComputer { private String cpu; private String screen; private String memory; private String mainboard; public NewComputer() { throw new RuntimeException(「can’t init」); } private NewComputer(Builder builder) { cpu = builder.cpu; screen = builder.screen; memory = builder.memory; mainboard = builder.mainboard; } public static final class Builder { private String cpu; private String screen; private String memory; private String mainboard; public Builder() {} public Builder cpu(String val) { cpu = val; return this; } public Builder screen(String val) { screen = val; return this; } public Builder memory(String val) { memory = val; return this; } public Builder mainboard(String val) { mainboard = val; return this; } public NewComputer build() { return new NewComputer(this); } } }
//測試:
public
class Click { public static void main(String[] args) { // 非 Builder 模式 Computer computer = new Computer(「cpu」, 「screen」, 「memory」, 「mainboard」); // Builder 模式 NewComputer newComputer = new NewComputer.Builder() .cpu(「cpu」) .screen(「screen」) .memory(「memory」) .mainboard(「mainboard」) .build(); } }
相關文章
相關標籤/搜索