《Android源碼設計模式解析與實戰》讀書筆記(三) 《Android源碼設計模式解析與實戰》PDF資料下載php
Builder模式是一步一步建立一個複雜對象的建立型模式,他容許用戶在不知道內部構建細節的狀況下,能夠更精細地控制對象的構造流程。設計模式
該模式是爲了將構建複雜對象的過程和它的部件解耦,使得構建過程和部件的表示隔離開來。bash
將一個複雜對象的構建與它的表示分離,使得一樣的構建過程能夠建立不一樣的表示。微信
示例:將計算機組裝的過程簡化爲構建主機、設置操做系統、設置顯示器3個部分,而後經過Director和具體的Builder來構建計算機對象。ide
/**
* 計算機抽象類,即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());
}
}
複製代碼
運行結果以下:ui
Computer Info:Computer{mBoard='英特爾主板', mDisplay='Retina顯示器', mOS='Mac OS X 10.10'}
複製代碼
上述示例中,經過具體的MacBookBuilder來構建MacBook對象,而Director封裝了構建複雜產品對象的過程,對外隱藏構建細節。Builder與Director一塊兒將一個複雜對象的構建與它的表示分離,使得一樣的構建過程能夠建立不一樣的對象。this
在現實開發過程當中,Director角色常常會被省略。而直接使用一個Builder來進行對象的組裝,這個Builder一般爲鏈式調用,其關鍵點是每一個setter方法都返回自身,也就是return this,這樣就使得setter方法能夠鏈式調用。這種形式不只去除了Director角色,整個結構也更加簡單,也能對Product對象的組裝過程有更精細的控制。spa
Builder模式在Android開發中較爲經常使用,一般做爲配置類的構建器將配置的構建和表示分離開來,同時也是將配置從目標類中隔離出來,避免過多的setter方法。Builder模式比較常見的實現形式是經過調用鏈實現,這樣使得代碼更簡潔、易懂。操作系統