1. 程式人生 > 實用技巧 >Builder模式

Builder模式

Builder模式

一、簡介

建造者模式(builder)是建立一個複雜物件的建立型模式,將構建複雜物件的過程和它的部件解耦,使得構建過程和部件的表示分離開來。

二、Builder模式的簡單實現

以計算機組裝的過程簡化為例,這裡把計算機的組裝簡化為3部分:構建主機、設定作業系統、設定顯示器。然後通過Director和具體的Builder來構造計算機物件。

//抽象產品類
public abstract class Computer{
    protected String mBoard;
    protected String mDisplay;
    protected String mOs;

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

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

    public void setmOs(String mOs) {
        this.mOs = mOs;
    }
}
//抽象Builder
public abstract class Builder{
    public abstract void buildBoard(String Board);
    public abstract void buildDisplay(String Display);
    public abstract void buildOs(String Os);
    public abstract Computer create();
}
//具體產品
public class MacComputer extends Computer{

}
//具體Builder
public class MacComputerBuilder extends Builder{
    Computer computer=new MacComputer();

    @Override
    public void buildBoard(String Board) {
      computer.setmBoard(Board);
    }

    @Override
    public void buildDisplay(String Display) {
        computer.setmDisplay(Display);
    }

    @Override
    public void buildOs(String Os) {
     computer.setmOs(Os);
    }

    @Override
    public Computer create() {
        return computer;
    }
}
//Director負責統一組裝
public class Director{
    Builder builder=null;

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

    public void construct(String board ,String dispaly,String os){
      builder.buildBoard(board);
      builder.buildDisplay(dispaly);
      builder.buildOs(os);
    }
}

//使用
public Computer Test(){
    Builder builder=new MacComputerBuilder();
    Director director=new Director(builder);
    director.construct("appale","顯示器","macos");
    return builder.create();
}

需要說明的是在實際開發過程中並不是採用上述方式,其中Director會被省略,組裝直接使用Builder且該Builder通常為鏈式呼叫。

三、使用建造者模式的場景和優缺點

使用場景

  • 當建立複雜物件的演算法應該獨立於該物件的組成部分以及它們的裝配方式時。
  • 相同的方法,不同的執行順序,產生不同的事件結果時。
  • 多個部件或零件,都可以裝配到一個物件中,但是產生的執行結果又不相同時。
  • 產品類非常複雜,或者產品類中的呼叫順序不同產生了不同的效能。
  • 建立一些複雜的物件時,這些物件的內部組成構件間的建造順序是穩定的,但是物件的內部組成構件面臨著複雜的變化。

優點

  • 使用建造者模式可以使客戶端不必知道產品內部組成的細節。
  • 具體的建造者類之間是相互獨立的,容易擴充套件。
  • 由於具體的建造者是獨立的,因此可以對建造過程逐步細化,而不對其他的模組產生任何影響。

四、Android原始碼中的Builder模式實現

Android中很多物件的建立都採用了Builder模式比較常用的就是AlertDialog.Builder

參考《Android原始碼設計模式解析與實戰》