本文主要解釋什麼是builder模式,及其作用。然後結合 android 原始碼來看一下builder模式的實現。
什麼是builder模式
build 是構建、建造的意思,builder 模式又稱建造者模式。
builder模式中包括兩個核心元素:產品和建造者。這兩者可以比作房屋和磚瓦匠。在建造房屋這個過程中,如果建築公司直接操作房子,除了要對牆壁的顏色、地板的材質、屋頂的形狀作出選擇外,還要注意建造房屋時的順序:先打地基、再壘牆壁、最後封頂等等。記住構建房屋的每一步及其順序,這對建築公司來說是十分麻煩的。而如果建築公司引入磚瓦匠的角色,將構建房子的流程等工作交給磚瓦匠,自己只需告訴磚瓦匠:「我要木質地板、白色的牆壁、紅色屋頂」即可,構建房屋所涉及的複雜流程就無需關心。另外,當建造房屋的流程發生變化時,建築公司仍然只需告訴磚瓦匠:「我要木質地板、白色的牆壁、紅色屋頂」,而不需作出任何改變。
由上邊的比喻可以看出,builder模式是將房子本身的設計、表示和房子的構建進行分離。不使用此模式,開發者不僅需要關注乙個產品的表示,比如alertdialog的title、button等介面元素,還要關注構建產品的步驟。更加重要的是,如果建造房屋的流程發生變化,不能夠再按照以前構建產品的方式建立產品的話,開發者就不得不修改**來適配新的構建流程。builder模式可以解決這些問題,為產品增加builder角色,將構建過程交給builder實現,開發者只需關心產品屬性的設定即可。
就像建築公司僱傭磚瓦匠需要發工資一樣,使用builder模式的缺點便是需要為增加的builder物件分配記憶體。
原始碼中的builder模式
在android原始碼中,比較常見的是alertdialog的使用。**如下:
val builder = alertdialog.builder(this)
builder.setmessage("message")
builder.settitle("title")
...builder.create().show()
以上**,無論構建alertdialog的流程如何變化,都無需改動**。因為構建過程在builder.create()
方法中,而create()
方法相對於開發者來說是隱藏的,無需關心的。唯一變化的是create()
內部,而這是由android框架實現的,也就是api發布方進行維護即可。這大大提高了**的靈活性、可維護性、可擴充套件性。
alertdialog的核心**如下:
public
class
alertdialog
extends
implements
dialoginte***ce
@override
public
void
settitle(charsequence title)
...//省略部分類似settitle()的**
public
static
class
builder
public builder settitle(@nullable charsequence title)
...//省略部分類似settitle()**
public alertdialog create()
...//省略部分**}}
builder 是在 alertdialog 內部實現的靜態類,其主要工作便是通過一系列set方法對 alertcontroller.alertparams 物件進行設定,alertparams類中包含了所有alertdialog檢視屬性對應的成員變數,比如mtitle、mmessage等等。然後在create()
方法中進行alertdialog的構建。
builder模式的實現比較簡單,但是除了「alertdialog初始化十分複雜,引數繁多」這種應用場景之外,還可以在以下場景中使用builder模式: 總結
builder模式用於將產品的構建和展示分離。這樣開發者就不必知道產品構建細節,只需對產品的外觀進行設計、配置即可。無需擔心產品構建流程發生變化。其缺點是需要為builder物件分配記憶體。但這也是大多數設計模式的共同缺點。
從原始碼角度來看UVM phase
說到uvm phase我們就知道是uvm乙個很重要的特性,從使用者角度來講,其實就是一些很簡單的應用規則,能夠極大地提公升編碼的效率,簡化 複雜度,提高debug的效率。至於應用可以參看zhangqiang大佬的第五章,這裡就不再贅述。本文就從原始碼的角度來看,uvm的phase是怎麼工作的?之前學...
從Android原始碼理解Binder
最近在看android原始碼,看到了binder部分,雖然對於這部分的內容感覺只理解了一小部分,但是畢竟還是看懂了小部分內容,所以想寫篇部落格記錄下自己的理解。在圖中,對於使用者空間,不同程序之間彼此是不能共享的,而核心空間卻是可共享的。在編寫應用程式時,如果想要實現binder機制,就需要以上四個...
獲取Android原始碼
git是linux torvalds為了幫助管理linux核心開發而開發的乙個開放原始碼的公布式版本控制軟體。在git版本控制系統中,每乙個工作目錄都包含乙個完整倉庫,它們支援離線工作。android是由kernel dalvik bionic build等多個git專案組成的,所以android專...