构建器模式_我喜欢构建器模式的三个原因
構(gòu)建器模式
有三種方法可以用Java編程語言創(chuàng)建新對(duì)象:
與其他兩種方法相比,我更喜歡使用構(gòu)建器模式。
為什么?
Joshua Bloch描述了構(gòu)建器模式以及在Effective Java中使用它的好處。 他的工作非常出色,在這篇博客文章中,我將不再重復(fù)這些好處。
取而代之的是,我將描述為什么我更喜歡構(gòu)建器模式而不是伸縮構(gòu)造器模式和Javabeans模式的三個(gè)其他原因。
1.幫助您進(jìn)行更好的設(shè)計(jì)
使用伸縮構(gòu)造函數(shù)模式或Javabeans模式意味著必須在創(chuàng)建實(shí)際對(duì)象之前創(chuàng)建所創(chuàng)建對(duì)象的屬性。
這可能是問題,也可能不是問題。
如果使用外部服務(wù)獲取創(chuàng)建的對(duì)象的屬性,則不會(huì)有問題。 但是,如果屬性是在創(chuàng)建“目標(biāo)”對(duì)象的方法中創(chuàng)建的,則會(huì)出現(xiàn)問題。
在后一種情況下,創(chuàng)建的對(duì)象的生命周期通常綁定到“目標(biāo)”對(duì)象的生命周期。
在這種情況下,構(gòu)建器模式可以幫助您使用稱為聚合的域驅(qū)動(dòng)設(shè)計(jì)(DDD)模式。 Martin Fowler指定聚合模式如下:
DDD聚合是域?qū)ο蟮娜杭?#xff0c;可以將它們視為一個(gè)單元。 一個(gè)示例可能是訂單及其訂單項(xiàng),它們將是單獨(dú)的對(duì)象,但是將訂單(連同其訂單項(xiàng))視為一個(gè)單獨(dú)的集合很有用。
構(gòu)建器模式可以幫助您以將域模型劃分為聚合的方式來設(shè)計(jì)代碼。 這意味著屬于聚合的所有對(duì)象都是由聚合根對(duì)象(訂單)創(chuàng)建的,并且只能通過聚合根對(duì)象進(jìn)行訪問。
這將構(gòu)造關(guān)系與邏輯關(guān)系移到它所屬的地方。
2.讓你思考
以傳統(tǒng)方式編寫代碼很容易,因?yàn)槟鸁o需思考。 您所要做的就是編寫將信息從一個(gè)地方復(fù)制到另一個(gè)地方的代碼。 可能要花一些時(shí)間,但這對(duì)您來說不是問題,因?yàn)槟幱谑孢m區(qū)。
也許您只是想處理代碼而不考慮自己在做什么。
我不是那樣的人(你也不應(yīng)該那樣)。
構(gòu)建器模式迫使您考慮對(duì)象。 更具體地說,它迫使您考慮以下事項(xiàng):
- 您必須找出對(duì)象的必需和可選屬性。
- 您必須確定將生命周期綁定到所創(chuàng)建對(duì)象的生命周期的屬性,并設(shè)計(jì)構(gòu)建器,以便其強(qiáng)調(diào)這一點(diǎn)。
- 您必須確定在創(chuàng)建對(duì)象后不能更新哪些屬性(并將這些屬性標(biāo)記為最終屬性)。
- 您必須決定可以更新哪些屬性,并找到更新它們的最佳方法。
找到這些問題的答案有助于您編寫更好的代碼。 我可以保證,如果您花時(shí)間找到這些問題的答案,您的代碼將比自動(dòng)駕駛儀上編寫的代碼好得多。
3.它幫助您創(chuàng)建特定于域的語言
如果使用伸縮構(gòu)造器模式或Javabeans模式創(chuàng)建新對(duì)象,則很難在代碼中添加業(yè)務(wù)含義。 您可以按照以下原則嘗試改善情況:
- 您可以向構(gòu)造函數(shù)參數(shù)添加業(yè)務(wù)含義的唯一方法是以適當(dāng)?shù)姆绞矫麉?shù)。 這很難做到,即使您做對(duì)了,結(jié)果也不是最佳的。
- 如果使用設(shè)置器,則當(dāng)然可以用一種添加設(shè)置器方法的方式來命名它們。 但是,您有多少次看到以該原理命名的setter方法?
在100個(gè)對(duì)象中,有99個(gè)創(chuàng)建的對(duì)象只是沒有意義的對(duì)象。 他們保存數(shù)據(jù)。 就這些。
使用構(gòu)建器模式時(shí),可以通過命名構(gòu)建器類的方法來創(chuàng)建用于創(chuàng)建新對(duì)象的域特定語言(DSL) 。 這可以幫助您在創(chuàng)建新對(duì)象的代碼中添加業(yè)務(wù)含義。
這就提出了一個(gè)問題:如何更新對(duì)象的屬性?
當(dāng)然,您可能會(huì)很無聊,并使用setter方法來更新對(duì)象的各個(gè)屬性。 但是您也可以做一些完全不同的事情。
您可以將這些屬性分組為有意義的組,而不用更新單個(gè)屬性,并且可以通過一種方法更新這些屬性的值。 如果正確命名此方法,則可以創(chuàng)建DSL來更新現(xiàn)有對(duì)象的信息。
這不是銀彈
布雷克?考德威爾(Blake Caldwell)表示, 對(duì)于構(gòu)造器來說,構(gòu)造器模式本質(zhì)上不太容易出錯(cuò) 。 我同意他的觀點(diǎn)。
當(dāng)您開始使用構(gòu)建器模式時(shí),首先要注意的是創(chuàng)建新對(duì)象的代碼更易于編寫和閱讀。 但是,一段時(shí)間后,您可能還會(huì)注意到其他好處。 我知道我做到了。
但是,重要的是要了解構(gòu)建器模式不是靈丹妙藥 。
我認(rèn)為, 沒有人會(huì)因?yàn)橐环N最佳實(shí)踐而遵循最佳實(shí)踐 。 這也適用于構(gòu)建器模式。
如果您的對(duì)象只有幾個(gè)構(gòu)造函數(shù)參數(shù),則使用構(gòu)建器模式?jīng)]有任何意義。 但是,由于此博客文章(和Effective Java)中所述的好處,您每次必須創(chuàng)建新對(duì)象時(shí)都應(yīng)考慮使用構(gòu)建器模式。
參考: Petri Kainulainen博客上我喜歡 JCG合作伙伴 Petri Kainulainen 的構(gòu)建器模式的三個(gè)原因 。翻譯自: https://www.javacodegeeks.com/2014/02/three-reasons-why-i-like-the-builder-pattern.html
構(gòu)建器模式
總結(jié)
以上是生活随笔為你收集整理的构建器模式_我喜欢构建器模式的三个原因的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 备案制度材料怎么写(备案制度材料)
- 下一篇: Apache Ant 1.10.6发布–