遇到多構造器時,使用構建器(2)

一、靜態工廠和構造器共同缺點:安全

  • 不能很好的擴展到大量可選參數

二、重疊構造器模式能夠部分解決上述問題,但遇到參數 太多 會使得客戶端代碼難以編寫、閱讀函數

  • 一長串類型相同的參數,會致使微妙的錯誤
  • 若有兩個點到順序,編譯器不報錯,運行時報錯,調試難度增長

三、簡化構造函數,採用setter方法:性能

  • 這種模式 JavaBean 構造過程狀態不一致,調試更加困難
  • 阻止了類作成 不可變類的可能<15條>
  • 保證線程安全較難

四、Builder(構建器)模式:ui

  • 保證狀態一致
  • 可讀性好

客戶端利用全部參數調用構建器,相似setter方法設置相關參數:線程

  • 客戶端能夠調用無參構造方法,生成不可變對象
  • Builder 是構建類的靜態成員類<22條>

構建該類:調試

  • 注意這裏 new NutritionFacts.Builder(240,8) 實例化的是內部靜態類Builder
  • NutritionFacts類在最後的build()方法內實例化的
  • 因此 NutritionFacts 類是不可變類沒問題

實例化外層類時,將builder的這些參數拷貝過去:對象

  • 此時依然能夠在構建類中,檢驗參數的合法性
  • 不合法,拋出 IllegalStateException 異常
  • 也能夠在 setter 方法中檢驗,這樣不用等到實例化才報錯

五、Builder模式靈活性編譯器

  • 能夠用來建立多個對象
  • builder 的參數能夠在建立時調整,隨對象改變
  • 也能夠自動填充某些域

六、設置了參數的 Builder 是一個很好的 抽象工廠it

  • 舉例以下(有限制的通配符)構建Tree:

Class.newInstance() 破壞了編譯時的異常檢查io

  • Builder彌補了該不足
  • newInstance老是企圖調用類的無參構造器

七、Builder模式不足:

  • 建立對象前,先建立構建器,性能有些許損耗
  • Builder模式比重疊構造器更冗長,故不少不少參數時才使用

END:

  • 若是類包含多個參數,構建器Builder是不錯的選擇
  • 特別是大多數參數是可選的時候
  • 構建器比重疊構造器 易於閱讀
  • 構建器比JavaBeans更加安全
相關文章
相關標籤/搜索