第2條遇到多個構(gòu)造器參數(shù)時要考慮用構(gòu)建器

靜態(tài)工廠和構(gòu)造器有個共同的局限性:它們都不能很好地擴(kuò)展到大量的可選參數(shù)酬凳。
應(yīng)用場景示例:
? 當(dāng)一些業(yè)務(wù)場景中互纯,往往在構(gòu)建一個類的對象時尚蝌,要求構(gòu)建該對象屬性時是可選的迎变。如一個類表示包裝食品外面顯示的營養(yǎng)成分標(biāo)簽。這些標(biāo)簽
中有2個必選的:含量飘言,卡路里衣形。還有超過20個可選的:總脂肪量、飽和脂肪量热凹、膽固醇泵喘、蛋白質(zhì)等泪电。不同的產(chǎn)品的營養(yǎng)成分中均有必選成分般妙,但可選的不同產(chǎn)品所需展示的不同。在這樣的情況下相速,客戶端如果根據(jù)不同的產(chǎn)品來構(gòu)建營養(yǎng)成分標(biāo)簽?zāi)兀?/p>

1.重疊構(gòu)造器方式:第一個構(gòu)造器提供一個必要參數(shù)的構(gòu)造器碟渺,第二個構(gòu)造器提供一個可選參數(shù),第三個有兩個可選參數(shù)突诬,依次類推苫拍,最后一個構(gòu)造器包含所有可選參數(shù)。
如下示例:

?

?

客戶端代碼可以選擇性地調(diào)用構(gòu)造器來滿足不同場景旺隙。但也存在問題:

a. 這個構(gòu)造器調(diào)用通常需要許多不想設(shè)置的參數(shù)绒极,但還是不得不為它們傳遞值。

b. 當(dāng)有許多參數(shù)的時候蔬捷,客戶端創(chuàng)建示例的代碼會很難編寫垄提,并且難以閱讀。


2.JavaBeans方式:調(diào)用一個無參構(gòu)造器來創(chuàng)建對象周拐,然后調(diào)用setter方法來設(shè)置每個必要的參數(shù)铡俐,以及所需的可選參數(shù)。
如下示例:

?

這種模式相比于重疊構(gòu)造器來說妥粟,創(chuàng)建示例很容易审丘,產(chǎn)生的代碼也容易讀。
遺憾的是勾给,JavaBeans方式自身有著很嚴(yán)重的缺點(diǎn):由于整個對象的構(gòu)建被分到了幾個調(diào)用中滩报,在構(gòu)造過程中JavaBean可能處在不一致的狀態(tài)锅知。類無法僅僅通過檢驗(yàn)構(gòu)造器參數(shù)的有效性來保證一致性。如果想要保證一致性露泊,需要程序員付出更多的努力來實(shí)現(xiàn)喉镰。


3.?????? 構(gòu)建器:不直接生成想要的對象,而是讓客戶端利用所有必要的參數(shù)調(diào)用構(gòu)造器惭笑,得到一個builder對象侣姆。然后客戶端在builder對象上調(diào)用類似與setter的方法,來設(shè)置每個相關(guān)的可選參數(shù)沉噩。最后捺宗,客戶端調(diào)用無參的build方法來生成不可變的對象。

如下示例:

?

?

先調(diào)用類的builder必要參數(shù)的構(gòu)造創(chuàng)建一個builder川蒙,再用setter設(shè)置各個可選參數(shù)(注意使用return this;可以構(gòu)造參數(shù)鏈)蚜厉,最后調(diào)用builder方法返回一個構(gòu)建好的對象

構(gòu)建器的好處:

a)?????? Builder像個構(gòu)造器,可以在builder方法中對象域里對其參數(shù)強(qiáng)加約束條件畜眨。也可以在builder的setter方法中加約束條件昼牛,當(dāng)校驗(yàn)失敗則拋出異常,取消了對象的整個構(gòu)建康聂。

?

b)?????? Builder可以有多個可變參數(shù)

?

c)?????? Builder方法可以自動填充域贰健,也可以返回不同的對象

?

d)?????? 使用泛型的builder,JDK1.5及以后的版本提供了Builder接口恬汁。

?

?

?

e)?????? Java傳統(tǒng)的抽象工廠實(shí)現(xiàn)是Class對象伶椿,用newInstance()來build。

?

評價:newInstance()會主動調(diào)用無參數(shù)的構(gòu)造函數(shù)氓侧,而且沒有編譯時錯誤脊另,只能在runtime拋出異常。這破壞了編譯時的異常檢查约巷。

?

f)??????? Builder模式的不足之處:必須先構(gòu)建Builder對象偎痛。所以相比前面兩種方式它更消耗性能,必須在有很多參數(shù)時才適合使用独郎。

?

總結(jié):當(dāng)一個類中有多個參數(shù)踩麦,在創(chuàng)建該類對象的業(yè)務(wù)需求中,要求客戶端在構(gòu)建該對象時可以選定要構(gòu)建的參數(shù)時囚聚,考慮使用構(gòu)建器模式

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末靖榕,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子顽铸,更是在濱河造成了極大的恐慌茁计,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,657評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異星压,居然都是意外死亡践剂,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評論 3 394
  • 文/潘曉璐 我一進(jìn)店門娜膘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來逊脯,“玉大人,你說我怎么就攤上這事竣贪【荩” “怎么了?”我有些...
    開封第一講書人閱讀 164,057評論 0 354
  • 文/不壞的土叔 我叫張陵演怎,是天一觀的道長匕争。 經(jīng)常有香客問我,道長爷耀,這世上最難降的妖魔是什么甘桑? 我笑而不...
    開封第一講書人閱讀 58,509評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮歹叮,結(jié)果婚禮上跑杭,老公的妹妹穿的比我還像新娘。我一直安慰自己咆耿,他們只是感情好德谅,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,562評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著票灰,像睡著了一般女阀。 火紅的嫁衣襯著肌膚如雪宅荤。 梳的紋絲不亂的頭發(fā)上屑迂,一...
    開封第一講書人閱讀 51,443評論 1 302
  • 那天,我揣著相機(jī)與錄音冯键,去河邊找鬼惹盼。 笑死,一個胖子當(dāng)著我的面吹牛惫确,可吹牛的內(nèi)容都是我干的手报。 我是一名探鬼主播,決...
    沈念sama閱讀 40,251評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼改化,長吁一口氣:“原來是場噩夢啊……” “哼掩蛤!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起陈肛,我...
    開封第一講書人閱讀 39,129評論 0 276
  • 序言:老撾萬榮一對情侶失蹤揍鸟,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后句旱,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體阳藻,經(jīng)...
    沈念sama閱讀 45,561評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡晰奖,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,779評論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了腥泥。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片匾南。...
    茶點(diǎn)故事閱讀 39,902評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖蛔外,靈堂內(nèi)的尸體忽然破棺而出蛆楞,到底是詐尸還是另有隱情,我是刑警寧澤夹厌,帶...
    沈念sama閱讀 35,621評論 5 345
  • 正文 年R本政府宣布臊岸,位于F島的核電站,受9級特大地震影響尊流,放射性物質(zhì)發(fā)生泄漏帅戒。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,220評論 3 328
  • 文/蒙蒙 一崖技、第九天 我趴在偏房一處隱蔽的房頂上張望逻住。 院中可真熱鬧,春花似錦迎献、人聲如沸瞎访。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽扒秸。三九已至,卻和暖如春冀瓦,著一層夾襖步出監(jiān)牢的瞬間伴奥,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評論 1 269
  • 我被黑心中介騙來泰國打工翼闽, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留拾徙,地道東北人。 一個月前我還...
    沈念sama閱讀 48,025評論 2 370
  • 正文 我出身青樓感局,卻偏偏與公主長得像尼啡,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子询微,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,843評論 2 354

推薦閱讀更多精彩內(nèi)容