設(shè)計模式讀書筆記(三)Builder 模式

1. Builder 模式的簡單實現(xiàn)(書中例子)

public abstract class Computer {

    protected String mBoard;

    protected String mDisplay;

    protected String mOS;

    protected Computer() {

    }

    public void setBoard(String board) {
        mBoard = board;
    }

    public void setDisplay(String display) {
        mDisplay = display;
    }

    public abstract void setOS();
}
public class Macbook extends Computer {

    protected Macbook() {

    }

    @Override
    public void setOS() {
        mOS = "Mac OS X";
    }
}
public abstract class Builder {

    public abstract void buildBoard(String board);

    public abstract void buildDisplay(String display);

    public abstract void buildOS();

    public abstract Computer create();
}
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;
    }
}
public class Director {

    Builder mBuilder;

    public Director(Builder builder) {
        mBuilder = builder;
    }

    public void construct(String board, String display) {
        mBuilder.buildBoard(board);
        mBuilder.buildDisplay(display);
        mBuilder.buildOS();
    }
}

書中給出的 Builder 模式實現(xiàn),最終通過調(diào)用 Director 對象的 construct() 方法來構(gòu)建 Computer,在學(xué)習(xí)工作中,我們經(jīng)常能看到 Builder 模式的另一種實現(xiàn)模式,直接通過鏈?zhǔn)秸{(diào)用 Builder 對象來構(gòu)建。下面以 OkHttp 中的 Request Builder 舉例,來看看他是怎么實現(xiàn) Builder 模式的。

public static class Builder {
    HttpUrl url;
    String method;
    Headers.Builder headers;
    RequestBody body;
    Object tag;

    public Builder() {
        this.method = "GET";
        this.headers = new Headers.Builder();
    }

    Builder(Request request) {
        this.url = request.url;
        this.method = request.method;
        this.body = request.body;
        this.tag = request.tag;
        this.headers = request.headers.newBuilder();
    }

    // Builder 的 set 方法,都會返回 Builder 自己,這樣就可以鏈?zhǔn)秸{(diào)用
    public Builder url(HttpUrl url) {
        if (url == null) throw new NullPointerException("url == null");
        this.url = url;
        return this;
    }

    // ……
    
    // 最后構(gòu)建的時候,將 Builder 對象自身作為 Request 構(gòu)造方法參數(shù)傳入,Request 通過提取 Builder 對象中的屬性,來構(gòu)建自身
    public Request build() {
        if (url == null) throw new IllegalStateException("url == null");
        return new Request(this);
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容