天天看點

Java設計模式(五)之建造者模式(Builder)

目錄

重疊構造器

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模式。