ps:代碼后期貼。
靜態(tài)工廠(static factory methon)和構(gòu)造器共同局限性:不能很好的擴(kuò)展到大量的可選參數(shù)五督。
一般情況下很多程序員使用重疊構(gòu)造器模式(telescoping constructor pattern)
優(yōu)點(diǎn):易于編寫藏否、易于調(diào)用,參數(shù)數(shù)量較少時(shí)適用充包。
缺點(diǎn):參數(shù)過多時(shí)容易失控副签,比如類型相同的參數(shù),不小心顛倒了其中兩個(gè)參數(shù)的位置基矮,編譯時(shí)不會報(bào)錯(cuò)淆储,而實(shí)際上運(yùn)行時(shí)就會出現(xiàn)錯(cuò)誤。
第二種方法家浇,JavaBeans模式(JavaBeans pattern)
實(shí)現(xiàn)過程:使用無參構(gòu)造器創(chuàng)建對象本砰,調(diào)用setter方法設(shè)置必要/可選參數(shù)。
優(yōu)點(diǎn):創(chuàng)建實(shí)例容易钢悲,代碼可讀性高灌具。
缺點(diǎn):
1、構(gòu)造對象的過程被分成了幾個(gè)調(diào)用導(dǎo)致JavaBean可能處于不一致的狀態(tài)譬巫。類無法通過校驗(yàn)構(gòu)造器參數(shù)的有效性來保證一致性咖楣,導(dǎo)致調(diào)試比較困難。
2芦昔、JavaBeans模式阻止了把類做成不可變的可能诱贿,會導(dǎo)致線程不安全,需要額外的控制來保持線程安全(在構(gòu)造完成前手工“凍結(jié)”對象,但這個(gè)方式很蠢而且無法編譯器無法確保程序員是否在使用之前先在對象上調(diào)用freeze方法)珠十。
第三種方法料扰,Builder模式(Builder Pattern)即建造者模式或者生成器模式,既能保證像重疊構(gòu)造器模式那樣的安全性焙蹭,又能保證像JavaBeans模式那樣的可讀性晒杈。
實(shí)現(xiàn)過程:不直接生成想要的對象,使用構(gòu)造器/靜態(tài)工廠來生成帶有必要參數(shù)的builder對象孔厉,然后在builder對象上調(diào)用類似setter的方法拯钻,設(shè)置可選參數(shù),最后調(diào)用無參的build方法來生成不可變的對象撰豺。
優(yōu)點(diǎn):
1粪般、調(diào)用會很容易,且可讀性高污桦。
2亩歹、比構(gòu)造器好的是,可以有多個(gè)可變參數(shù)凡橱。而構(gòu)造器只能有一個(gè)可變參數(shù)小作。
3、可利用單個(gè)builder構(gòu)建多個(gè)對象稼钩。builder的參數(shù)可以在創(chuàng)建對象期間進(jìn)行調(diào)整顾稀,且可自動(dòng)填充某些域(比如每次創(chuàng)建對象時(shí)自動(dòng)增添序列號)。
4变抽、可對參數(shù)強(qiáng)加約束條件。方法一:build方法中檢驗(yàn)這些約束條件氮块,在對象域中進(jìn)行檢驗(yàn)绍载,如果違反了約束條件,build方法拋出IllegalStateException滔蝉。方法二:用多個(gè)setter方法對某個(gè)約束條件必須持有的所有參數(shù)進(jìn)行檢查击儡,如果不滿足,setter方法拋出IllegalStateException蝠引。好處就是在setter中就可以檢驗(yàn)二不是等build時(shí)才發(fā)現(xiàn)錯(cuò)誤阳谍。
缺點(diǎn):
1、有額外的開銷螃概。為了創(chuàng)建對象需要先新建builder矫夯,雖然開銷比較小,但是在十分注重性能的情況下會成為問題吊洼。
2训貌、代碼冗長,因此只適合4個(gè)或者更多參數(shù)的情況。但是如果預(yù)料到將來可能有更多的參數(shù)递沪,推薦在一開始的時(shí)候就使用建造者模式豺鼻,因?yàn)榈鹊綄?shí)際出現(xiàn)多個(gè)參數(shù)時(shí)再添加,就會變得難看款慨,因?yàn)橛幸恍┡f的構(gòu)造器或者靜態(tài)工廠儒飒。