ホームページ >Java >&#&チュートリアル >ファクトリーパターン
ファクトリ パターンは、オブジェクトを作成するためのインターフェイスを定義する作成パターンですが、どのクラスをインスタンス化するかをサブクラスに決定させます。ファクトリ パターンでは、クラスのインスタンス化をサブクラスに延期できます。
「product」継承階層があり、そこに他のプロダクトを追加できる場合は、Factory パターンを使用します。 (Product は Factory メソッドによって返されるオブジェクトを参照します)
Simple Factory について知らない場合は、事前に勉強しておくことをお勧めします。リソースはたくさんありますが、私のブログはここにあります。
以前、Simple Factory を導入し、オブジェクトの作成をクライアント コードから切り離しながら、さまざまなハンバーガーを生産できました。私たちのハンバーガー ショップは利益を得ることができたので、今度は別のエリアで他のハンバーガー ショップを立ち上げたいと考えています。
orderBurger メソッドは、顧客にハンバーガーを販売するプロセスを定義します。
// This is our Client public class BurgerShop { public Burger orderBurger(BurgerType type) { // Factory is responsible for object creation Burger burger = SimpleBurgerFactory.createBurger(type); burger.prepareBun(); burger.grillPatty(); burger.addToppings(); burger.wrap(); return burger; } }
これは全く問題ありませんが、他のハンバーガーショップを立ち上げたらどうなるでしょうか? 「SeaSideBurgerShop」を起動すると、SeaSideBurgerShop クラスを作成し、独自の orderBurger() を定義します。問題は、トッピングを追加するのを忘れたり、間違った順序で作業を行ったりする可能性があることです。
問題のある SeaSideBurgerShop:
public class SeaSideBurgerShop { public Burger orderBurger(BurgerType type) { Burger burger = SimpleBurgerFactory.createBurger(type); burger.prepareBun(); burger.wrap(); // Wrap a burger before grilling a patty?? burger.grillPatty(); // They forget to add toppings!! return burger; } }
これを防ぐには、プロセスを実行する順序と何を行うかを定義しつつ、柔軟な対応を可能にするフレームワークがバーガー ショップに必要です。
バーガーショップ
この抽象クラスには、orderBurger() と createBurger() という 2 つのメソッドがあります。 orderBurger() は、何を行うか、どの順序でプロセスを実行するかを定義します。これにより、バーガーショップが工程を忘れたり、工程順序を間違えたりすることを防ぎます。 creatBurger() は、どの種類のハンバーガーを作るかをサブクラスに決定させる抽象メソッドです。
BurgerShop サブクラス
これらのコンクリート BurgerShop は、コンクリート バーガーの作成を担当します。 BurgerShop を拡張する各サブクラスは、createBurger().
バーガー
この抽象クラスは、すべてのバーガー間で共通のインターフェイスを提供し、デフォルトの動作を定義します。
ハンバーガーのサブクラス
弊社の具体的な製品をご紹介します。 Burger クラスを拡張する限り、メソッドをオーバーライドすることで特定の動作を実装できます。
// This is our Client public class BurgerShop { public Burger orderBurger(BurgerType type) { // Factory is responsible for object creation Burger burger = SimpleBurgerFactory.createBurger(type); burger.prepareBun(); burger.grillPatty(); burger.addToppings(); burger.wrap(); return burger; } }
public class SeaSideBurgerShop { public Burger orderBurger(BurgerType type) { Burger burger = SimpleBurgerFactory.createBurger(type); burger.prepareBun(); burger.wrap(); // Wrap a burger before grilling a patty?? burger.grillPatty(); // They forget to add toppings!! return burger; } }
public enum BurgerType { BEEF, CHICKEN, FISH, VEGGIE }
public abstract class Burger { public BurgerType type; public List<String> toppings = new ArrayList<>(); public void prepareBun() { System.out.println("Preparing a bun"); } public void grillPatty() { if (type == null) { throw new IllegalStateException("pattyType is undefined"); } System.out.println("Grill a " + type + " patty"); } public void addToppings() { for (String item : toppings) { System.out.println("Add " + item); } } public void wrap() { System.out.println("Wrap a burger up"); } }
public class CityStyleBeefBurger extends Burger { public CityStyleBeefBurger() { type = BurgerType.BEEF; List<String> items = List.of("lettuce", "pickle slices", "tomato slice", "BBQ sauce"); toppings.addAll(items); } }
public class CityStyleVeggieBurger extends Burger { public CityStyleVeggieBurger() { type = BurgerType.VEGGIE; List<String> items = List.of("smoked paprika", "garlic chips", "crushed walnuts", "veggie sauce"); toppings.addAll(items); } }
public class SeaSideStyleBeefBurger extends Burger { public SeaSideStyleBeefBurger() { type = BurgerType.BEEF; // Localized toppings for beef burger in seaside area List<String> items = List.of("lettuce", "pickle slices", "tomato slice", "salty sauce"); toppings.addAll(items); } // Uses localized wrapping paper @Override public void wrap() { System.out.println("Wrap with a paper with nice sea scenery"); } }
public class SeaSideStyleFishBurger extends Burger { public SeaSideStyleFishBurger() { type = BurgerType.FISH; // Localized toppings for fish burger in seaside area List<String> items = List.of("red onion slices", "salty sauce", "fried shrimps"); toppings.addAll(items); } // Uses localized wrapping paper @Override public void wrap() { System.out.println("Wrap with a paper with nice sea scenery"); } }
public abstract class BurgerShop { // This method provides a framework for each burger shops to order burgers public Burger orderBurger(BurgerType type) { Burger burger = createBurger(type); burger.prepareBun(); burger.grillPatty(); burger.addToppings(); burger.wrap(); return burger; } // This is our factory method. Subclasses will override this method, // provide their own implementation, determine which kind of burger gets made. public abstract Burger createBurger(BurgerType type); }
出力:
public class CityBurgerShop extends BurgerShop { @Override public Burger createBurger(BurgerType type) { return switch (type) { case BEEF -> new CityStyleBeefBurger(); case VEGGIE -> new CityStyleVeggieBurger(); default -> throw new IllegalArgumentException("unknown city burger type"); }; } }
ここですべてのデザイン パターンの実装を確認できます。
GitHub リポジトリ
追伸
技術ブログを書くのは初めてです。文章を改善するためのアドバイスや、わかりにくい点がある場合は、コメントを残してください。
読んでいただきありがとうございます:)
以上がファクトリーパターンの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。