當我們需要建立一個複雜的對象時,使用靜态工廠或者構造器的方式就顯得特别笨拙和醜陋,因為它們有個共同的局限性:它們都不能很好地擴充到大量的可選參數,也就是說,靈活性很差。那麼,對于這樣的類,我們應該如何建立對象呢?本文列舉了三種解決辦法:重疊構造器模式、javabeans模式和builder模式,并通過具體執行個體對上述三種方法進行鋪墊和對比,進而真正幫助讀者了解builder模式。
當我們需要建立一個複雜的對象時,使用靜态工廠或者構造器的方式就顯得特别笨拙和醜陋,因為它們有個共同的局限性:它們都不能很好地擴充到大量的可選參數。考慮用一個person類來描述一個人,除了姓名,性别,生日,郵箱,身高,學曆,綽号,體重,通訊位址等等。對于這樣的類,我們應該如何建立對象呢?無論是常見的重疊構造器模式還是javabeans模式,它們都不能很好地解決這類問題,而我們本文所着重闡述的builder模式則正好是解決此類問題的利劍。為了更深入的了解builder模式所帶來的好處,我們先分别采用重疊構造器模式和javabeans模式來解決上述問題。
使用這種模式建立對象時,存在一下幾點不足:
靈活性很差:隻能給事先設計好的參數個數來進行指派,實體類代碼臃腫
代碼難以編寫與閱讀:當屬性有很多的時候,代碼不但看起來很醜陋,而且極易出錯,構造參數順序不能颠倒.
這種方式雖然保證了靈活性,也不易出錯,但是其本身也存在這一些固有的缺點,比如:
setter的存在妨礙了其成為不可變類的可能:在并發環境下,我們就不得不考慮其線程安全性;
代碼醜陋且對象易處于不一緻狀态:上面建立對象的方式也比較醜陋,同時由于對象的構造過程分為若幹個函數調用,是以容易導緻對象處于不一緻狀态。
使用builder模式建立複雜對象,不但可以避免上述兩種方式的缺點,而且還能兼顧們各自的優點。該模式的内涵是:不直接生成想要的對象,而是讓用戶端利用 所有必要的參數 構造一個builder對象,然後在此基礎上,調用類似于setter的方法來設定每個可選參數,最後通過調用無參的build()方法來生成不可變對象。
使用lombok進行實體類代碼的簡化,直接添加@builder就可以實作
我們可以通過下面的方式來建立一個person對象
顯而易見,使用這種方式建立對象不但靈活而且易于閱讀,且不易出錯.
這樣就把重疊構造器模式、javabeans模式兩種的優點結合起來,彌補了缺點,這樣就可以随便的來給對象中的參數進行指派.
做出了一點點修改,更加好了解,在此謝謝大佬的文章,寫的非常好!!