ビルダーのパターンコードの理解

目次

前書き:

1.ビルダーモード

2.コード


前書き:

ビルダーモードはどのシナリオに適していますか?:一部の基本コンポーネントは変更されませんが、それらの組み合わせは頻繁に変更されます。

リファレンス:https : //www.runoob.com/design-pattern/builder-pattern.html


1.ビルダーモード

意図:複雑な構造をその表現から分離して、同じ構築プロセスで異なる表現を作成できるようにすること。

主な解決策:主な解決策は、ソフトウェアシステムで、「複雑なオブジェクト」の作成に直面することです。これは通常、特定のアルゴリズムを持つさまざまな部分のサブオブジェクトで構成されます。要件の変更により、この複雑なオブジェクトのさまざまな部分がしばしば直面します。大幅な変更がありますが、それらを組み合わせるアルゴリズムは比較的安定しています。

使用する場合:一部の基本コンポーネントは変更されませんが、組み合わせは頻繁に変更されます。

解決方法:変化と不変を分離します。

キーコード:ビルダー:例を作成して提供し、ディレクター:作成された例の依存関係を管理します。

適用例:  1. KFCに行く、ハンバーガー、コーラ、フライドポテト、フライドチキンウィングなどは変更されず、それらの組み合わせは頻繁に変化し、いわゆる「定食」になります。2. JAVAのStringBuilder。

利点:  1.ビルダーは独立しており、拡張が容易です。2.詳細なリスクを管理するのは簡単です。

短所:  1.製品には共通のポイントが必要であり、範囲が限定されています。2.内部の変更が複雑な場合、多くの建設タイプがあります。

使用シナリオ:  1.生成されるオブジェクトの内部構造は複雑です。2.生成する必要があるオブジェクトの内部プロパティは互いに依存しています。

注:ファクトリーモードとの違いは、ビルダーモードは部品の組み立て順序に注意を払うことです。


2.コード

同図に示すように、お客様のご要望に応じて、対応する「お食事」をお届けできるように、さまざまな組み合わせの「パッケージ」を提供するファストフード店のインターフェース図を示しています。

シナリオ:食品の基本的な構成要素はそれほど変化しないかもしれませんが、提供されるパッケージにはさまざまな組み合わせがある場合があります。

  • 最初に食品を表すインターフェースを設計し、次にさまざまな種類の食品がこのインターフェースを実装します。
  • Foodにはパッケージがあるため、パッケージを表すインターフェースを設計し、特定のパッケージがこのインターフェースを実装して実装クラスを形成します。

ビルダーパターンのUML図

特定のコード参照記事。

コアクラス:

1)アイテムオブジェクトを含む食事クラス:

Meal.java


import java.util.ArrayList;
import java.util.List;
 
public class Meal {
   private List<Item> items = new ArrayList<Item>();    
 
   public void addItem(Item item){
      items.add(item);
   }
 
   public float getCost(){
      float cost = 0.0f;
      for (Item item : items) {
         cost += item.price();
      }        
      return cost;
   }
 
   public void showItems(){
      for (Item item : items) {
         System.out.print("Item : "+item.name());
         System.out.print(", Packing : "+item.packing().pack());
         System.out.println(", Price : "+item.price());
      }        
   }    
}

2)MealBuilderクラス。実際のビルダークラスは、Mealオブジェクトの作成、つまり異なる組み合わせを返す責任があります。

MealBuilder.java


public class MealBuilder {
 
   public Meal prepareVegMeal (){
      Meal meal = new Meal();
      meal.addItem(new VegBurger());
      meal.addItem(new Coke());
      return meal;
   }   
 
   public Meal prepareNonVegMeal (){
      Meal meal = new Meal();
      meal.addItem(new ChickenBurger());
      meal.addItem(new Pepsi());
      return meal;
   }
}

3)MealBuilderを使用してMealオブジェクトを生成し、テストします。

public class BuilderPatternDemo {
   public static void main(String[] args) {
      MealBuilder mealBuilder = new MealBuilder();
 
      Meal vegMeal = mealBuilder.prepareVegMeal();
      System.out.println("Veg Meal");
      vegMeal.showItems();
      System.out.println("Total Cost: " +vegMeal.getCost());
 
      Meal nonVegMeal = mealBuilder.prepareNonVegMeal();
      System.out.println("\n\nNon-Veg Meal");
      nonVegMeal.showItems();
      System.out.println("Total Cost: " +nonVegMeal.getCost());
   }
}
执行程序,输出结果:

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

3.まとめ

一文で:複数のコンポーネントの異なる組み合わせを返すオブジェクトを提供します。

おすすめ

転載: blog.csdn.net/Longtermevolution/article/details/107865659