目錄
重疊構造器
JavaBeans
Builder模式
建設現在有一個實際問題:使用一個類表示包裝食品外面顯示的各種營養标簽。這些标簽中有幾個屬性是必須:每份的含量和每份的卡路裡。還有超過20個可選的屬性:總脂肪量、鈉含量、蛋白質含量等等。大多數産品在某幾個可選的屬性中會有非零的值。對于這樣的類,如何建構呢?
如下我們使用很多個構造器實作了該類:
上面可選參數,我們僅僅使用了2個,如果是20個,構造器複雜度可想而知。用戶端代碼如下構造對象:
重疊構造器模式有如下幾個特點:
(1)重疊構造器模式是可行的;
(2)參數過多時,用戶端代碼編寫困難;
(3)用戶端代碼可讀性較差;
下面嘗試使用JavaBeans模式對重疊構造器模式進行改進。
JavaBeans模式通過先構造一個無參構造器,然後再調用setter方法來設定每個參數,具體代碼如下:
此時用戶端就可以如下構造對象了:
JavaBeans模式有如下幾個特點:
(1)相對重疊構造器模式,用戶端代碼可讀性有增強,建立執行個體也相對容易些;
(2)JavaBeans模式有一個嚴重的缺點,就是對象的構造分解為多個setter方法調用中,在構造過程中,對象可能處于不一緻的狀态,比如多線程通路該對象時,主線程在調用完bean.setCalories(30);另一個線程通路了該對象,此時得到的fat屬性值為0,而主線程接着調用完bean.setFat(30);得到的對象的fat屬性值就變為30了。
下面使用Builder模式解決如上模式的缺點。
Builder模式有很多的寫法,這裡采用如下寫法:
描述食品外包顯示的營養成分的類有三個部分組成:
(1)屬性;
(2)構造全部屬性的構造器;
(3)内部類Builder;
類的構造由内部類Builder完成。用戶端代碼調用如下:
Builder模式有如下幾個特點:
(1)用戶端代碼可讀性強,編寫也相對容易;
(2)對象的構造是安全的,彌補了JavaBeans模式。