《Android原始碼設計模式解析與實戰》讀書筆記(三) 《Android原始碼設計模式解析與實戰》PDF資料下載
一、Builder模式簡介
Builder模式是一步一步建立一個複雜物件的建立型模式,他允許使用者在不知道內部構建細節的情況下,可以更精細地控制物件的構造流程。
該模式是為了將構建複雜物件的過程和它的部件解耦,使得構建過程和部件的表示隔離開來。
1.1、定義
將一個複雜物件的構建與它的表示分離,使得同樣的構建過程可以建立不同的表示。
1.2、使用場景
- 相同的方法,不同的執行順序,產生不同的事件結果時。
- 多個部件或零件,都可以裝配到一個物件中,但是產生的執行結果又不相同時。
- 產品類非常複雜,或者產品類中的呼叫順序不同產生了不同的作用,這個時候使用建造者模式非常適合。 4.當初始化一個物件特別複雜,如引數多,且很多引數都具有預設值時。
二、Builder模式的簡單實現
示例:將計算機組裝的過程簡化為構建主機、設定作業系統、設定顯示器3個部分,然後通過Director和具體的Builder來構建計算機物件。
/**
* 計算機抽象類,即Product角色
*/
public abstract class Computer {
protected String mBoard;
protected String mDisplay;
protected String mOS;
protected Computer() {}
//設定CPU核心數
public void setBoard(String board) {
mBoard =board;
}
//設定記憶體
public void setDisplay(String display) {
mDisplay = display;
}
//設定作業系統
public abstract void setOS();
@Override
public String toString() {
return "Computer{" +
"mBoard='" + mBoard + '\'' +
", mDisplay='" + mDisplay + '\'' +
", mOS='" + mOS + '\'' +
'}';
}
}
複製程式碼
/**
* 具體的Computer類,MacBook
*/
public class Macbook extends Computer {
protected Macbook() {}
@Override
public void setOS() {
mOS = "Mac OS X 10.10";
}
}
複製程式碼
/**
* 抽象Builder類
*/
public abstract class Builder {
//設定主機
public abstract void buildBoard(String board);
//設定顯示器
public abstract void buildDisplay(String display);
//設定作業系統
public abstract void buildOS();
//建立Computer
public abstract Computer create();
}
複製程式碼
/**
* 具體的Builder類,MacbookBuilder
*/
public class MacbookBuilder extends Builder {
private Computer mComputer = new Macbook();
@Override
public void buildBoard(String board) {
mComputer.setBoard(board);
}
@Override
public void buildDisplay(String display) {
mComputer.setDisplay(display);
}
@Override
public void buildOS() {
mComputer.setOS();
}
@Override
public Computer create() {
return mComputer;
}
}
複製程式碼
/**
* Director類,負責構造Computer
*/
public class Director {
Builder mBuilder = null;
public Director(Builder builder) {
mBuilder = builder;
}
/**
* 構建物件
*/
public void construct(String board, String display) {
mBuilder.buildBoard(board);
mBuilder.buildDisplay(display);
mBuilder.buildOS();
}
}
複製程式碼
public class Main {
public static void main(String[] args) {
//構建器
Builder builder = new MacbookBuilder();
//Director
Director pcDirector = new Director(builder);
//封裝構建過程,4核、記憶體2GB、Mac系統
pcDirector.construct("英特爾主機板","Retina顯示器");
//構建計算機,輸出相關資訊
System.out.println("Computer Info:" + builder.create().toString());
}
}
複製程式碼
執行結果如下:
Computer Info:Computer{mBoard='英特爾主機板', mDisplay='Retina顯示器', mOS='Mac OS X 10.10'}
複製程式碼
上述示例中,通過具體的MacBookBuilder來構建MacBook物件,而Director封裝了構建複雜產品物件的過程,對外隱藏構建細節。Builder與Director一起將一個複雜物件的構建與它的表示分離,使得同樣的構建過程可以建立不同的物件。
在現實開發過程中,Director角色經常會被省略。而直接使用一個Builder來進行物件的組裝,這個Builder通常為鏈式呼叫,其關鍵點是每個setter方法都返回自身,也就是return this,這樣就使得setter方法可以鏈式呼叫。這種形式不僅去除了Director角色,整個結構也更加簡單,也能對Product物件的組裝過程有更精細的控制。
三、總結
Builder模式在Android開發中較為常用,通常作為配置類的構建器將配置的構建和表示分離開來,同時也是將配置從目標類中隔離出來,避免過多的setter方法。Builder模式比較常見的實現形式是通過呼叫鏈實現,這樣使得程式碼更簡潔、易懂。
3.1、優點
- 良好的封裝性,使用建造者模式可以使客戶端不必知道產品內部組成的細節。
- 建造者獨立,容易擴充套件。
3.2、缺點
- 會產生多餘的Builder物件以及Director物件,消耗記憶體。