設計模式:Android AlertDialog的builder(建造者模式)

最近,公司一個大牛問了個問題,Android中的AlertDialog的創建方法AlertDialog.Builder 是什麼形式,有什麼好處?
所以,最近一直都在看設計模式。
然後自己一點總結,在此記錄一下:

建造者模式

將一個複雜對象的構造與它的表示分離,使同樣的構建過程可以創建不同的表示,這樣的設計模式被稱爲建造者模式。

建造者模式的具體介紹,請移步我的上一篇blog 設計模式:Java 建造者模式(Builder)
在此就不多做介紹了,本文主要說的是Android的AlertDialog

建造者模式通常包括下面幾個角色:

  1. builder:給出一個抽象接口,以規範產品對象的各個組成成分的建造。這個接口規定要實現複雜對象的哪些部分的創建,並不涉及具體的對象部件的創建。

  2. ConcreteBuilder:實現Builder接口,針對不同的商業邏輯,具體化複雜對象的各部分的創建。 在建造過程完成後,提供產品的實例。

  3. Director:調用具體建造者來創建複雜對象的各個部分,在指導者中不涉及具體產品的信息,只負責保證對象各部分完整創建或按某種順序創建。

  4. Product:要創建的複雜對象。

具體如下圖:
建造者模式

通過前文知道,一般建造者模式,都是把一系列具有共同屬性、不同表現形式的對象抽象出來,通過一個接口 builder 來規定其所具有的屬性。然後通過指導者 Director 來把builder 中的屬性安裝一定的規則組裝起來。
我們事先需要把 接口builder和領導者 Director 定義好。
然後每當有具備此屬性的新的實例的話,只需要寫其基於builder的實現類,來設定其各種屬性,而不需要再去實裝一遍。

但是,Android中的AlertDialog中的Builder,並不是這種實現方式。
通過源碼看以看出,AlertDialog中的Builder是一個內部類。

我們可以這樣理解:

  1. AlertDialog中的Builder也對應 構建者模式的builder,他同樣規定了,這個對象所具有的屬性。

  2. 然後AlertDialog中的AlertController對應構建者模式的 Director,其中AlertController.AlertParams 記錄了Builder中的所有屬性,然後通過AlertDialog的構造方法實現了對象的構造

那麼兩種方式有什麼不同呢?

  1. 實現接口的形式,接口中定義的方法,其實現類都必須實現。而且,實現類可以定義自己的方法。這樣構建出來的所有Builder都不是同一個類的對象。並且都具有一部分相同的必須屬性和一部分私有的屬性。(這裏屬性,對應的是接口中的方法)。但是,內部類的形式,因爲我們每次都是去實例化一個內部類的對象,所以,每一個構建出的Builder都是同一個類的對象,都具有相同的屬性,但是可以根據我們自己的選擇來設置不同的屬性,然後在Director中根據屬性的不同來顯示不同的形式。

  2. 實現接口的形式,其創建,是把對應的Builder傳入Director 去創建,然後在builder中提供一個公有的方法,來返回創建完成的對象。而內部類的形式,是實例化一個內部類Builder的對象,然後設置我們需要的屬性,最後通過內部類的一個公有方法返回一個外部類的對象。

這只是自己的一點見解,比較膚淺,希望有幸看到這篇文章的人,可以提出問題,大家共同進步。

發佈了46 篇原創文章 · 獲贊 34 · 訪問量 29萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章