1、定義とUMLモデリング図

複雑なオブジェクトの構築をその表現から分離し、同じ構築プロセスが異なる表現を作成できるようにする。

2、使用シーン:

複数の部品やパーツがすべて1つのオブジェクトに組み立てられるが、生成される実行結果は同じである。

製品クラスが非常に複雑である、または製品クラス内の呼び出し順序が異なると異なる作用が生じる。

オブジェクトの初期化が特に複雑な場合。例えば、複数のコンストラクタを使用する場合、または多くのパラメータがあり、すべてにデフォルト値がある場合など。

3、コアクラス

  • (1)抽象製品クラス computer。
  • (2)Builder 抽象ビルダー。製品の組み立てを規定し、通常はサブクラスが具体的な組み立てプロセスを実装する。
  • (3)MacbookBuilder 具体的なBuilderクラスであり、具体的にオブジェクトを作成するクラス。
  • (4)Directror 組み立てプロセスを統一的に行う。

1台のコンピュータの組み立てを主とし、主にホストの組み立て、オペレーティングシステムの設定、ディスプレイの設定を行う。

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("Intel マザーボード","Retina ディスプレイ"); Computer computer = builder.build(); System.out.println(computer.toString()); } }

5.まとめ

複雑なオブジェクトを柔軟に構築するために、そのオブジェクトには複数のメンバー変数がある。外部から呼び出す際に、すべてのメンバー変数を一度に作成する必要がない、または不便な場合がある。このような状況で、複数のコンストラクタを使ってオブジェクトを構築すると、保守が困難になる。そこでBuilderデザインパターンがこの問題を解決する。buid() メソッド内でオブジェクトを作成し、builderを渡す。そのbuilder内で、渡されたオブジェクトのメンバー変数を維持する。

作者:OneXzgj

リンク:https://www.jianshu.com/p/f958ba891467