ビルダーパターン
ビルダーパターンは作成型デザインパターンの一つで、複雑なオブジェクトを作成する手順と表現方法を分離できるようにします。
ビルダーパターンは作成型デザインパターンの一つで、その主な目的は、複雑なオブジェクトの構築プロセスとその表現を分離し、異なる表現形式を持つオブジェクトを作成できるようにすることです。
概要
意図
複雑な構築プロセスとその表現を分離し、同じ構築プロセスで異なる表現を作成できるようにします。
主な解決
ソフトウェアシステムでは、複雑なオブジェクトの作成は通常、複数の部分で構成されます。これらの部分の組み合わせは頻繁に変化しますが、組み合わせのアルゴリズムは比較的安定しています。
使用するタイミング
一部の基本部品は変わらないが、その組み合わせが頻繁に変化する場合。
解決方法
変化する部分と変化しない部分を分離します。
キーコード
- ビルダー:インスタンスを作成して提供します。
- ディレクター:構築されたインスタンスの依存関係を管理し、構築プロセスを制御します。
適用例
- ケンタッキーを例にとると、ハンバーガー、コーラ、フライドポテト、フライドチキンなどは変わりませんが、その組み合わせは頻繁に変化し、さまざまな「セット」が生成されます。
- Java における
StringBuilder。
長所
- 構築プロセスと表現を分離することで、構築プロセスがより柔軟になり、異なる表現を構築できます。
- 構築プロセスをより適切に制御でき、具体的な構築の詳細を隠すことができます。
- コードの再利用性が高く、異なる構築プロセスで同じビルダーを再利用できます。
短所
- 製品の属性が少ない場合、ビルダーパターンはコードの冗長性を引き起こす可能性があります。
- システムのクラスとオブジェクトの数が増加します。
使用シーン
- 生成するオブジェクトが複雑な内部構造を持つ場合。
- 生成するオブジェクトの内部属性が相互に依存している場合。
注意事項
ファクトリーパターンとの違いは、ビルダーパターンが部品の組み立て順序により重点を置いていることです。
構造
ビルダーパターンには、以下の主要な役割が含まれます:
プロダクト(Product):構築する複雑なオブジェクト。プロダクトクラスには通常、複数の部分または属性が含まれます。
抽象ビルダー(Builder):製品を構築するための抽象インターフェースを定義し、製品の各部分を構築するメソッドを含みます。
具体ビルダー(Concrete Builder):抽象ビルダーインターフェースを実装し、製品の各部分の構築方法を具体的に決定し、最終的に構築された製品を返す責任を負います。
ディレクター(Director):ビルダーのメソッドを呼び出して製品を構築する責任を負います。ディレクターは具体的な構築プロセスを理解せず、製品の構築順序と方法のみに関心を持ちます。
実装
ファーストフード店のビジネスケースを想定します。典型的なセットは、ハンバーガー(Burger)と冷たい飲み物(Cold drink)で構成されます。ハンバーガー(Burger)は、ベジバーガー(Veg Burger)またはチキンバーガー(Chicken Burger)で、紙の箱に包まれています。冷たい飲み物(Cold drink)は、コカ・コーラ(coke)またはペプシ(pepsi)で、瓶に入っています。
私たちは、食品アイテム(ハンバーガーや冷たい飲み物など)を表すItemインターフェースと、それを実装するItemエンティティクラス、および食品の包装を表すPackingインターフェースと、それを実装するPackingエンティティクラスを作成します。ハンバーガーは紙の箱に包まれ、冷たい飲み物は瓶に入っています。
次に、私たちはMealクラスを作成します。このクラスにはItemのArrayListと、を組み合わせることでItem異なるタイプのMealオブジェクトを作成するためのMealBuilder。BuilderPatternDemoクラスを使用してMealBuilderを作成しますMeal。
ステップ 1
食品アイテムと食品パッケージを表すインターフェースを作成します。
Item.java
Packing.java
ステップ 2
Packing インターフェースを実装するエンティティクラスを作成します。
Wrapper.java
Bottle.java
ステップ 3
Item インターフェースを実装する抽象クラスを作成します。このクラスはデフォルトの機能を提供します。
Burger.java
ColdDrink.java
ステップ 4
Burger と ColdDrink を拡張するエンティティクラスを作成します。
VegBurger.java
ChickenBurger.java
Coke.java
Pepsi.java
ステップ 5
上記で定義した Item オブジェクトを持つ Meal クラスを作成します。
Meal.java
ステップ 6
MealBuilder クラスを作成します。実際のビルダークラスは Meal オブジェクトの作成を担当します。
MealBuilder.java
ステップ 7
BuiderPatternDemo は MealBuilder を使用して、ビルダーパターン(Builder Pattern)をデモンストレーションします。
BuilderPatternDemo.java
ステップ 8
プログラムを実行し、結果を出力します:
Veg Meal Item : Veg Burger, Packing : Wrapper, Price : 25.0 Item : Coke, Packing : Bottle, Price : 30.0 Total Cost: 55.0 Non-Veg Meal Item : Chicken Burger, Packing : Wrapper, Price : 50.5 Item : Pepsi, Packing : Bottle, Price : 35.0 Total Cost: 85.5