首先提出幾個問題:
- 什么是Builder模式?
- 為什么要使用Builder模式?它的優點是什么,那缺點呢?
- 什么情況下使用Builder模式?
關于Builder模式在代碼中用的很多,比如AlertDialog, OkHttpClient等。一提到模式感覺像是一個很牛的招式。用起來很炫。
那先看看Builder是由什么組成,他的基本思想是什么
從類圖中可以看出Builder 有四個角色
- 抽象建造者(Builder)角色:給出一個抽象接口,以規范產品對象的各個組成成分的建造。該接口定義兩種方法,一種方法是建造方法,一般來說, 產品所包含的零件數目與建造方法的數目相符。
- 具體創建者(Concrete Builder)角色: 擔任這個角色的是與應用程序緊密相關的一些類,它們在應用程序調用下創建產品的實例。這個角色要完成的任務包括:1.實現抽象建造者Builder所生命的接口,給出一步一步地完成產品實例的操作。2.在建造過程完成后,提供產品的實例。
- 導演者(Director)角色, 擔任這個角色的類調用具體建造者角色以創建產品對象。
- 產品(Product)角色:產品(Product)便是建造中的復雜對象。
回到前面的問題,為什么要使用建造模式呢
- 一個對象會有一些重要的性質,在它們沒有恰當的值之前,對象不能作為一個完成的產品使用。
一個對象的一些性質必須按照某個順序賦值才有意義。
這個時候,此對象相當于一個有待建造的產品,而對象的
些性質相當于產品的零件,建造茶品的過程是建造零件的過
程。由于建造零件的過程很復雜,因此,這些零件的建造過
程往往被“外部化”到另一個稱為建造者的對象里,建造者對
象返還給客戶端的是一個全部零件都建造完畢的產品對象。
那么在什么情況下才應該使用建造模式需要生成的產品對象有復雜的內部結構,每一個成分本身也可以是對象,也可以僅僅是對象的的一個組成成分。
- 需要生成的產品對象的屬性相互依賴。建造模式可以強制實行一種分步驟進行的建造過程。因此,如果產品對象的一個屬性必須在另一個屬性被賦值之后才可以被賦值,使用建造模式便是一個很好的設計思想。
- 在對象創建過程中會使用到系統中的其他一些對象,這些對象在產品對象的創建過程中不易得到。
下面來看一下建造模式的優點
- 建造模式的使用使得產品可以獨立地變化。使用建造模式可以使客戶端不必知道產品的內部組成的細節。
- 每一個Builder都相對獨立,而其他的Build無關。
- 模式所建造的最終產品更容易于控制。