1. 程式人生 > >設計模式:builder 建造者模式

設計模式:builder 建造者模式

設計模式能很好的解決多引數構造複雜的問題,程式碼可讀性高,易維護,缺點是過於冗長。其基本思想是在構造的類中,使用一個靜態內部Builder類提供的build方法來構造該物件,Builder內部類對所有的引數有方法化。

https://blog.csdn.net/xu404741377/article/details/73699523
Builder模式介紹
Builder模式是一種一步一步建立一個複雜物件的設計模式,我認為這種設計模式的精髓就主要有兩點:其一,使用者使用簡單,並且可以在不需要知道內部構建細節的情況下,就可以構建出複雜的物件模型;其二,對於設計者來說,這是一個解耦的過程,這種設計模式可以將構建的過程和具體的表示分離開來。

Builder模式的使用場景
1.相同的方法,不同的執行順序,產生不同的時間結果時。
2.多個部件或零件,都可以裝配到一個物件中,但是產生的執行結果又不同時。
3.產品類非常複雜,或者產品類中的呼叫順序不同產生了不同的作用,這個時候用建造者模式非常適合。
4.當初始化一個物件特別複雜,如引數多,切很多引數都具有預設值時。

Builder模式分析
我們為什麼要把程式碼的構建和表示分離開來?1.增加程式碼的可讀性;2.方便維護。舉一個例子,安卓中非常常用的AlertDialog就是Builder模式,我們知道,一個Dialog可以有非常多的屬性和引數,例如title,icon,message, positiveButton,negativeButton等十幾個引數,如果這些引數都放在建構函式裡,那麼這個方法將會有很多引數,為了完成這個函式,需要一次性準備好所有的引數,很容易寫著寫著就亂了。同時為了適配,還需要寫很多過載的建構函式,類會很亂。而如果使用builder模式,不需要一次性準備好所有的引數,完全可以一個一個準備,程式碼易懂,方便非常多。

舉例說明
有一個Person類,有name,age,job,sex等等N多屬性,這裡我用s1,s2,s3…s10代替。
在這裡插入圖片描述
接下來在Person類的內部定義一個靜態的Builder類,並且定義對應的s1-s10方法,方法返回型別都是Builder
在這裡插入圖片描述
最後,增加一個build()方法,將所有的屬性都設定進去
在這裡插入圖片描述
程式碼的可讀性高了很多,試想一下如果new了一個Person類,建構函式裡傳了10個引數,看起來就非常頭疼,以後想改某一個值的話,還要去找程式碼看相應的含義。而Builder模式的可讀性就非常高,只需要去修改相應的Builder靜態類中的方法即可。

總結
Builder模式與傳統的模式相比,並不是完全勝出的,相比之下,Builder模式的程式碼量會比正常多不少,但是隨之帶來的好處是程式碼的可讀性和可維護性。但是,往往一個好的設計模式或架構,就是在犧牲某一種能力從而大大增強另一種能力,例如,犧牲一定的可讀性,增加專案的可擴充套件性等等這樣的方式。因此,在引數較為複雜,構造物件相對繁瑣的情況下,一定要首先考慮使用Builder模式。