自由擴充套件你的專案——Builder模式

HunterArley發表於2019-01-24

《Android原始碼設計模式解析與實戰》讀書筆記(三) 《Android原始碼設計模式解析與實戰》PDF資料下載

一、Builder模式簡介

Builder模式是一步一步建立一個複雜物件的建立型模式,他允許使用者在不知道內部構建細節的情況下,可以更精細地控制物件的構造流程。

該模式是為了將構建複雜物件的過程和它的部件解耦,使得構建過程和部件的表示隔離開來。

1.1、定義

將一個複雜物件的構建與它的表示分離,使得同樣的構建過程可以建立不同的表示。

1.2、使用場景

  1. 相同的方法,不同的執行順序,產生不同的事件結果時。
  2. 多個部件或零件,都可以裝配到一個物件中,但是產生的執行結果又不相同時。
  3. 產品類非常複雜,或者產品類中的呼叫順序不同產生了不同的作用,這個時候使用建造者模式非常適合。 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、優點

  1. 良好的封裝性,使用建造者模式可以使客戶端不必知道產品內部組成的細節。
  2. 建造者獨立,容易擴充套件。

3.2、缺點

  1. 會產生多餘的Builder物件以及Director物件,消耗記憶體。

學海無涯苦作舟

我的微信公眾號

相關文章