設計模式 --- Builder模式
阿新 • • 發佈:2018-11-22
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.對於某些必須設定的引數一定設定好預設值,否則程式碼編譯能通過 而實際執行中會報錯