設計模式——Builder模式
1.Builder模式介紹
Builder模式是一步一步建立一個複雜物件的建立型模式,可以讓使用者在不知道內部構造細節的情況下精確控制物件的構造流程。該模式是為了將構建複雜物件的過程和它的部件解耦,使構建過程和部件的表示隔離開。
2.Builder模式定義
將一個複雜物件的構建與它的表示分離,使得同樣的構建過程可以建立不同的展示。
3.Builder模式使用場景
- a.相同方法,不同執行順序,產生不同事件結果
- b.多個部件和零件都可以裝配到一個物件中,但產生的執行結果不相同
- c.產品類非常複雜,產品類中的呼叫順序不同產生了不同的作用
- d.初始化物件特別複雜,引數眾多,且很多引數都具有預設值
3.Builder模式UML類圖

Builder模式UML類圖(摘自網路)
類圖解析:
- Product : 產品抽象類
- Builder : 抽象Builder類,規範產品組建,一般是由子類實現具體的組建過程
- ConcreteBuilder : 具體的Builder類(實現Builder類)
- Director : 統一組裝過程
4.例項解析
4.1例項背景
組裝計算機,過程簡化為:構建主機、設定作業系統、設定顯示器。
4.2構建計算機類,即Product角色
//計算機抽象類 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(); @Override public String toString() { return "Computer [mBoard=" + mBoard+ ", mDisplay=" + mDisplay + ", mOs=" + mOs+ "]"; } }
//具體的計算機類,Macbook public class Macbook extends Computer { protected Macbook (){} @Override public void setOS() { mOs = "Mac OS X 10";//設定預設作業系統 } }
4.3構建抽象Builder類
public abstract class Builder { //設定主機 public abstract void buildBoard(String board); //設定顯示器 public abstract void buildDisplay(String display); //設定作業系統 public abstract void buildOS(); //建立計算機類 public abstract Computer create(); }
4.3構建具體的Builder類
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; } }
4.3構建Director類 構造Computer
public class Director { Builder mBuilder =null; public Director(Builder builder){ this.mBuilder =builder; } //構建物件 public void construct(String board, String display){ mBuilder.buildBoard(board); mBuilder.buildDisplay(display); mBuilder.buildOS(); } }
4.4測試
public class Test { public static void main (String[] args) { //構造器 Builder builder = new MacbookBuilder (); //Director Director mDirector = new Director (); mDirector.construct("英特爾主機板", "Dell顯示器 "); System.out.println("Computer Info : "+ builder.create().toString); } }
輸出結果
Computer Info :Computer [mBoard=英特爾主機板, mDisplay=Dell顯示器, mOs=Mac OS X 10]
5.Builder模式精簡
現實開發中,Director角色經常會被省略而直接用一個Builder來進行物件的組裝,這個Builder通常為鏈式呼叫,關鍵點是每個set方法都返回自身,也就是return this,程式碼大致如下
new TsetBuilder().setA("A").set("B").create();
通過這種形式不進去除了Director角色,整個結構也更加簡單,也可以對Product物件的組裝過程更加精細控制。
建議檢視Android原始碼AlertDialog實現,AlertDialog.Builder同時扮演了Builder、ConcreteBuilder、Director的角色,簡化了Builder模式的設計!
5.Builder模式總結
- 優點
- (1)良好的封裝性,使用建造者模式可以使呼叫者不必知道產品內部的組成的細節
- (2)建造者獨立,容易擴充套件
- 缺點
會產生多餘的Builder物件以及Director物件,消耗記憶體。