設計模式—build模式

簡介

Builder模式是一步一步創建一個複雜對象的創建型模式,它允許用戶在不知道內部構建細節的情況下,可以更精細的控制對象的構造流程。該模式是爲了將構建複雜對象的過程和它的部件解耦,使得構建過程和部件的表示隔離開來,兩者之間的耦合度也降到最低。

定義

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

使用場景

1.相同的方法,不同的執行順序,產生不同的事件結果。(View的封裝,對外暴露的方法不同)

2.多個部件或零件,都可以裝配到一個對象中,但是產生的運行結果又不相同時

3.產品類非常複雜,或者產品類中的調用順序不同產生了不同的作用

4.初始化一個對象特別複雜,如參數特別多且很多都具有默認參數時

關鍵點

原始版-四個角色

一個產品類—需要被構建的產品

一個抽象Build類—隔離產品組件的構建

一個具體構建產品的Build實現類—產品組件的具體構建

一個組裝類—組件與產品的組裝

簡易版—兩個角色

一個產品類—需要被構建的產品

一個Builder類—一般爲產品類的靜態內部類,負責組件的具體構建和產品的組裝

實現

例:

原始版

/**
 * 產品類-Computer
 */
public class Computer {

    private String mBoard;
    private String mDisplay;
    private String mOS;

    public String getmBoard() {
        return mBoard;
    }

    public void setmBoard(String mBoard) {
        this.mBoard = mBoard;
    }

    public String getmDisplay() {
        return mDisplay;
    }

    public void setmDisplay(String mDisplay) {
        this.mDisplay = mDisplay;
    }

    public String getmOS() {
        return mOS;
    }

    public void setmOS() {
        this.mOS = mOS;
    }
}
/**
 * 抽象Build類-構建與產品類相關的部件
 */
public abstract class Builder {

    /**
     *構建主機組件
     */
    public abstract void setBoard(String board);

    /**
     * 構建顯示器組件
     */
    public abstract void setDisplay(String display);

    /**
     * 構建操作系統組件
     */
    public abstract void setOs();

    /**
     * 構建產品
     */
    public abstract Computer create();
}
/**
 * 抽象Build的實現類-真正構建產品的類
 */
public class ComputerBuilder extends Builder {

    private Computer computer = new Computer();

    @Override
    public void setBoard(String board) {
        computer.setmBoard(board);
    }

    @Override
    public void setDisplay(String display) {
        computer.setmDisplay(display);
    }

    @Override
    public void setOs() {
        computer.setmOS();
    }

    @Override
    public Computer create() {
        return computer;
    }
}
/**
 * 組裝類:將builder構建的產品部件組裝成產品,對外隱藏內部組裝細節
 */
public class Director {

    private Builder mBuilder;

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

    public void construct(String board, String display) {
        mBuilder.setBoard(board);
        mBuilder.setDisplay(display);
        mBuilder.setOs();
    }
}

使用

Builder builder = new ComputerBuilder();
        Director director = new Director(builder);
        director.construct("因特爾主板", "三星顯示器");
        Computer computer = builder.create();

簡易版

`/**
* 產品類-Computer
*/
public class Computer {

private String mBoard;
private String mDisplay;
private String mOS;

public String getmBoard() {
    return mBoard;
}

public void setmBoard(String mBoard) {
    this.mBoard = mBoard;
}

public String getmDisplay() {
    return mDisplay;
}

public void setmDisplay(String mDisplay) {
    this.mDisplay = mDisplay;
}

public String getmOS() {
    return mOS;
}

public void setmOS() {
    this.mOS = mOS;
}


public static class Builder {

    private String mBoard;
    private String mDisplay;
    private String mOS;

    public Builder setBoard(String board) {
        this.mBoard = board;
        return this;
    }

    public Builder setDisplay(String display) {
        this.mDisplay = display;
        return this;
    }

    public Builder setOs() {
        return this;
    }

    /**
     * 組裝產品
     */
    private void construct(Computer computer) {
        computer.setmBoard(mBoard);
        computer.setmDisplay(mDisplay);
        computer.setmOS();
    }

    public Computer create() {
        Computer computer = new Computer();
        construct(computer);
        return computer;
    }
}
使用
Computer computer = new Computer.Builder().setBoard("")
                .setDisplay("")
                .setOs()
                .create();

小結

Builder模式通常作爲配置類的構建器將配置的構建和表示分離開來,同時也是將配置從目標類中隔離出來,避免作爲過多的setter方法。Builder模式比較常見的實現形式是通過鏈式調用,這樣使得代碼更加簡潔、易懂。

優點:

1.良好的封裝性,使用建造者模式可以使客戶端不必知道產品內部組成的細節

2.建造者獨立,容易擴展

缺點:

會產生多餘的Builder對象以及Director對象,消耗內存。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章