1. 程式人生 > >設計模式 --- Builder模式

設計模式 --- Builder模式

1.定義

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

 

2.使用場景

1.相同的方法,不同的執行順序,產生不同的結果。

2.多個部分都可以裝配到一個物件中,但產生的結果又不相同。

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

4.初始化一個物件特別複雜,引數多,且很多引數具有預設值。

 

3.簡單實現

將計算機的組裝簡化為構建主機、設定作業系統、設定顯示3個部分,然後通過Director和具體的Bulider來構建計算機物件。

//計算機抽象類
public abstract class Computer{
    protected String mBoard;
    protected String mDisplay;
    protected String mOs;
    protected Computer(){}

    //構建主機
    public void setmBoard(String board){ mBoard = board; }
    //設定顯示
    public void setmDisplay(String display){ mDisplay = display; }
    //設定系統
    public abstract void setmOs();

    @Override
    public String toString() {
        return "Computer -> Board:" + mBoard +" Display:"+ mDisplay +" OS:" + mOs;
    }
}

//具體計算機類 Mac
public class MacBook extends Computer{
    protected MacBook(){}

    @Override
    public void setmOs() {
        mOs = "Mac OS X 10.01";
    }
}

//抽象Builder類
public abstract class Builder{
    //構建主機
    public abstract void buliderBoard(String board);
    //設定顯示
    public abstract void builderDisplay(String display);
    //設定作業系統
    public abstract void builderOs();
    //建立Computer
    public abstract Computer create();
}

//具體Builder類
public class MacBookBuilder extends Builder{
    private  Computer computer = new MacBook();

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

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

    @Override
    public void builderOs() { computer.setmOs();}

    @Override
    public Computer create() {
        return computer;
    }
}

//Director 負責構建Computer
public class Director{
    Builder mBuilder = null;
    public Director(Builder builder){ mBuilder = builder; }
    //構建物件
    public void constrcut(String board,String display){
        mBuilder.builderDisplay(display);
        mBuilder.buliderBoard(board);
        mBuilder.builderOs();
    }
}

public  class Test{
    public static void main(String[] args){
        //構建器
        Builder builder = new MacBookBuilder();
        //Director
        Director director = new Director(builder);
        //構建一個 因特爾主機板 Retina顯示器 的Mac電腦
        director.constrcut("英特爾","Retina");
        System.out.print(builder.create().toString());
        
    }
}

示例通過具體的MacBulider構建MacBook物件,Director封裝了構建產品物件的過程,對外隱藏細節。

在實際開發中Director通常被省略,直接使用一個Bulider來進行物件的組裝,這個Builder通常為鏈式呼叫,實現方式是在每個setter方法中返回自身,這種形式使結構更加簡潔直觀,也能多組裝的過程又更精細的控制。

只需要將Director類刪除,修改抽象Bulider類方法返回自身,如下

//抽象Builder類
public abstract class Builder{
    //構建主機
    public abstract Builder buliderBoard(String board);
    //設定顯示
    public abstract Builder builderDisplay(String display);
    //設定作業系統
    public abstract Builder builderOs();
    //建立Computer
    public abstract Computer create();
}
//具體Builder類
public class MacBookBuilder extends Builder{
    private  Computer computer = new MacBook();

    @Override
    public Builder buliderBoard(String board) {
        computer.setmBoard(board);
        return this;
    }

    @Override
    public Builder builderDisplay(String display) {
        computer.setmDisplay(display);
        return this;
    }

    @Override
    public Builder builderOs() {
        computer.setmOs();
        return this;
    }

    @Override
    public Computer create() {
        return computer;
    }
}
public  class Test{
    public static void main(String[] args){
        //構建器
        Builder builder = new MacBookBuilder();
        //構建一個 因特爾主機板 Retina顯示器 的Mac電腦
        //鏈式呼叫
        Computer mComputer = builder.buliderBoard("因特爾").builderDisplay("Retina").builderOs().create();
        System.out.print(mComputer.toString());

    }
}

4.小結

Builder模式通常作為配置類的構建器將配置的構建和表示分離出來,同時也是將配置從目標類中隔離。通常使用鏈式呼叫的方法,使得程式碼更簡潔易懂。

優點:

1.良好的封裝性,使使用者不必知道內部組成的細節。

2.建造著獨立,容易拓展。

缺點:

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

2.對於某些必須設定的引數一定設定好預設值,否則程式碼編譯能通過 而實際執行中會報錯