Builder は生成に関するデザインパターンの一つで、 複雑なオブジェクトを段階的に構築することができます。
他の生成に関するパターンとは異なり、 Builder ではプロダクト (訳注: 本パターンでは、 生成されるモノのことを一般にプロダクトと呼びます) が共通のインターフェースを持つ必要はありません。 このため、 同じ構築の手続きを経て、 異なるプロダクトを作成することができます。
複雑度:
人気度:
使用例: Builder パターンは Java の世界では、 よく知られているパターンです。 多くの設定オプションを持つオブジェクトを作成する必要がある場合に特に便利です。
Builder は、 Java のコア・ライブラリーで広く使われています:
見つけ方: Builder パターンは、 一つのクラスが生成メソッドを一つ持ち、 結果として得られるオブジェクトの構成を行うメソッドがいくつかあることで識別できます。 ビルダーのメソッドは、 多くの場合連結できます (例: someBuilder.setValueA(1).setValueB(2).create()
)。
段階的な車の生産
この例では、 Builder パターンを使って、 異なる自動車のモデルを段階的に構築します。
この例ではまた、 Builder が同じ構築段階を使って違う種類のプロダクト (車のマニュアル) を作る方法も紹介します。
ディレクターは、 構築の順番を管理します。 特定のモデルを生産するためにはどの構築ステップを呼ぶべきかを知っています。 ビルダーとは共通のインターフェースのみを介して仕事をします。 このため、 型の異なるビルダーをディレクターに渡すことが可能となります。
最終的な結果としてのプロダクトは、 クライントがビルダー・オブジェクトから直接取得します。 ディレクターは、 結果物の型を知らないからです。 ビルダーだけが正確に何を構築するのかを知っています。
builders
builders/Builder.java: 共通のビルダー・インターフェース
builders/CarBuilder.java: 車のビルダー
builders/CarManualBuilder.java: 車のマニュアルのビルダー
cars
cars/Car.java: 車プロダクト
cars/Manual.java: 車マニュアル・プロダクト
cars/CarType.java
components
components/Engine.java: プロダクト特性 1
components/GPSNavigator.java: プロダクト特性 2
components/Transmission.java: プロダクト特性 3
components/TripComputer.java: プロダクト特性 4
director
director/Director.java: ディレクターがビルダーを管理
Demo.java: クライアント・コード
OutputDemo.txt: 実行結果