1、定義以及 UML 建模圖

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

2、使用場景:

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

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

初始化一個對象特別復雜,如使用多個構造方法,或者說有很多參數,并且都有默認值時。

3、核心類

  • (1) 抽象產品類 computer。
  • (2) Builder 抽象 Builder,規范產品的組建,一般是由子類實現具體的組建過程。
  • (3)MacbookBuilder 具體的Builder類,具體的創建對象的類。
  • (4) Directror 統一組建過程。

以組裝一臺計算機為主,主要進行組裝主機,設置操作系統,設置顯示器。

4、具體使用

4.1 計算機抽象類 Computer

Computer.java

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) { this.mDisplay = display; } public abstract void setOs() ; @Override public String toString() { return "Computer{" + "mBoard='" + mBoard + '\'' + ", mDisplay='" + mDisplay + '\'' + ", mOs='" + mOs + '\'' + '}'; } }

4.2 具體產品類 MacBook

MacBook.java

public class MacBook extends Computer{ protected MacBook() { } @Override public void setOs() { mOs="Mac OS X 12"; } }

4.3 抽象 Builder

Builder.java

public abstract class Builder { abstract void buildBoard(String board); abstract void buildDisplay(String display); abstract void buildOs(); abstract Computer build(); }

4.4 具體的 Builder

MacBookBuilder.java

public class MacBookBuilder extends Builder { private Computer mComputer=new MacBook(); @Override void buildBoard(String board) { mComputer.setBoard(board); } @Override void buildDisplay(String display) { mComputer.setDisplay(display); } @Override void buildOs() { mComputer.setOs(); } @Override Computer build() { return mComputer; } }

4.5 Director類,負責具體的構造 Computer

Director.java

public class Director { Builder mBuilser=null; public Director(Builder builer) { this.mBuilser = builer; } public void construct(String board,String display){ mBuilser.buildDisplay(display); mBuilser.buildBoard(board); mBuilser.buildOs(); } }

4.6 具體使用

Test.java

public class Test { public static void main(String[] args){ Builder builder=new MacBookBuilder(); Director pcDirector=new Director(builder); pcDirector.construct("英特爾主板","Retina顯示器"); Computer computer = builder.build(); System.out.println(computer.toString()); } }

5.總結

為了靈活構造復雜對象,該對象會有多個成員變量,在外部調用的時候,不需要或者不方便一次性創建出所有的成員變量,在這種情況下,使用多個構造方法去構建對象,很難維護,這時候Builder設計模式解決這個問題,進行buid()方法中創建對象,并且將builder傳入,該builder中,維護了傳入對象的成員變量。

作者:OneXzgj

鏈接:https://www.jianshu.com/p/f958ba891467