從Android原始碼來看「Builder模式」

2021-08-18 09:34:49 字數 2074 閱讀 1166

本文主要解釋什麼是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專...