CodeGym /Java Blog /ランダム /工場設計パターン
John Squirrels
レベル 41
San Francisco

工場設計パターン

ランダム グループに公開済み
こんにちは!今日も引き続きデザインパターンの勉強をしていきます。このレッスンでは、工場について話します。このパターンが解決する問題について説明し、コーヒー ショップのオープンに工場がどのように役立つかの例を見ていきます。さらに、工場を作成するための 5 つの簡単な手順も紹介します。 工場設計パターン - 1 私たち全員が同じ波長を共有し、この概念をすぐに理解できるようにするには、次のトピックについてよく理解しておく必要があります。
  • Java での継承
  • Java における参照型の縮小と拡大
  • 異なるクラスとオブジェクト間の相互作用。

工場とは何ですか?

ファクトリ デザイン パターンを使用すると、オブジェクトの作成を制御できます。新しいオブジェクトを作成するプロセスは非常に単純ではありませんが、過度に複雑でもありません。new新しいオブジェクトを作成するにはオペレーターが必要であることは誰もが知っています。おそらく、ここでは制御できるものは何もないように思われますが、それは真実ではありません。アプリケーションに多くの子孫を持つ特定のクラスがあるとします。特定の条件に応じて、特定のクラスのインスタンスを作成する必要がある場合、問題が発生する可能性があります。ファクトリ、特定の条件に応じてさまざまなオブジェクトを作成する問題の解決に役立つデザイン パターンです。抽象的な概念としてはどうでしょうか?以下の例を見ると、これがより明確かつ具体的になります。

色々な種類のコーヒーを用意してみよう

コーヒーショップを自動化したいとします。さまざまな種類のコーヒーの作り方をプログラムに教える必要があります。これを行うには、コーヒー クラスと、準備するコーヒーの種類 (アメリカーノ、カプチーノ、エスプレッソ、ラテ) を表すいくつかの派生クラスを作成します。一般的なコーヒーのクラスから始めましょう。

public class Coffee {
    public void grindCoffee(){
        // Grind the coffee
    }
    public void makeCoffee(){
        // Brew the coffee
    }
    public void pourIntoCup(){
        // Pour into a cup
    }
}
次に、その子クラスを作成します。

public class Americano extends Coffee {}
public class Cappuccino extends Coffee {}
public class CaffeLatte extends Coffee {}
public class Espresso extends Coffee {}
お客様はどんな種類のコーヒーでも注文できます。彼らの命令はプログラムに渡される必要があります。これは、 を使用するなど、さまざまな方法で実行できますString。しかし、これにはanがenum最適です。enum注文できるコーヒーの種類に対応する列挙型フィールドを 作成して定義します。

public enum CoffeeType {
    ESPRESSO,
    AMERICANO,
    CAFFE_LATTE,
    CAPPUCCINO
}
素晴らしい。次に、コーヒーショップのコードを書いてみましょう。

public class CoffeeShop {
    
    public Coffee orderCoffee(CoffeeType type) {
        Coffee coffee = null;
        
        switch (type) {
            case AMERICANO:
                coffee = new Americano();
                break;
            case ESPRESSO:
                coffee = new Espresso();
                break;
            case CAPPUCCINO:
                coffee = new Cappucсino();
                break;
            case CAFFE_LATTE:
                coffee = new CaffeLatte();
                break;
        }

        coffee.grindCoffee();
        coffee.makeCoffee();
        coffee.pourIntoCup();

        System.out.println("Here's your coffee! Thanks! Come again!");
        return coffee;
    }
}
このorderCoffee方法は 2 つの部分に分けることができます。
  1. ステートメント内でのコーヒーの特定のインスタンスの作成switch。ここでファクトリーは、条件に応じて特定のタイプを作成することを行います。
  2. 準備 — これは、粉砕し、抽出し、カップに注ぐことです。
将来メソッドを変更する必要がある場合に知っておくべき重要な点は次のとおりです。
  1. 準備自体に含まれる手順 (挽く、淹れる、カップに注ぐ) は変わりません (少なくとも私たちはこれに期待しています)。
  2. ただしコーヒーの種類は変更になる場合がございます。モカ…フラップ…モカッチ…とにかく新しい種類のコーヒーを作り始めようかな。
将来的にはメソッドのステートメントに変更を加えなければならないことは、すでにかなり確信で​​きていますswitch。私たちのコーヒーショップでは、このorderCoffee方法だけがさまざまな種類のコーヒーを作るわけではない可能性もあります。その結果、いくつかの場所で変更を加える必要があります。おそらくあなたは私が何を言いたいのかすでに理解しているでしょう。リファクタリングする必要があります。コーヒーの作成を担当するブロックを別のクラスに移動する理由は次の 2 つです。
  1. コーヒー製造ロジックを他の場所で再利用できます。
  2. 品揃えが変わっても、コーヒーが作成されるすべての場所でコードを編集する必要はありません。コードを 1 か所だけ変更するだけで十分です。
つまり、工場を立ち上げる時期が来たのです。

最初の工場を設立する

これを行うには、コーヒー クラスの必要なインスタンスの作成のみを担当する新しいクラスを作成します。

public class SimpleCoffeeFactory {
    public Coffee createCoffee(CoffeeType type) {
        Coffee coffee = null;

        switch (type) {
            case AMERICANO:
                coffee = new Americano();
                break;
            case ESPRESSO:
                coffee = new Espresso();
                break;
            case CAPPUCCINO:
                coffee = new Cappucino();
                break;
            case CAFFE_LATTE:
                coffee = new CaffeLatte();
                break;
        }
        
        return coffee;
    }
}
おめでとう!ファクトリ デザイン パターンを (ほぼ) 最も単純な形で実装しました。メソッドを静的にすれば、さらに簡単になったかもしれませんcreateCoffee。しかし、その場合、次の 2 つの機能が失われます。
  1. SimpleCoffeeFactoryメソッドを継承およびオーバーライドする機能createCoffee
  2. 必要なファクトリ実装をクラスに追加する機能。
さて、実装と言えば…コーヒーショップに戻ってコーヒー製造工場を追加する必要があります。

コーヒーショップに工場を追加する

ファクトリを使用してコーヒー ショップ クラスを書き直してみましょう。

public class CoffeeShop {

    private final SimpleCoffeeFactory coffeeFactory;

    public CoffeeShop(SimpleCoffeeFactory coffeeFactory) {
        this.coffeeFactory = coffeeFactory;
    }

    public Coffee orderCoffee(CoffeeType type) {
        Coffee coffee = coffeeFactory.createCoffee(type);
        coffee.grindCoffee();
        coffee.makeCoffee();
        coffee.pourIntoCup();

        System.out.println("Here's your coffee! Thanks! Come again!");
        return coffee;
    }
}
素晴らしい。次に、ファクトリ デザイン パターンの一般的な構造について簡潔に説明します。

自分の工場を開くための 5 つのステップ

ステップ 1. 以下の図に示すように、プログラムには複数の子孫を持つクラスがあります。 ステップ 2.各子クラスのフィールドを持つ を 工場設計パターン - 2作成します。enum

    enum CatType {
        LION,
        TIGER,
        FLUFFY
    }
ステップ 3. 工場を構築します。と呼んでくださいCatFactory。コードは次のとおりです。

class CatFactory {}
ステップ 4. ファクトリで、引数createCatを取るメソッドを作成しますCatType。コードは次のとおりです。

    class CatFactory {
        public Cat createCat(CatType type) {
            
        }
    }
ステップ 5. メソッドの本体に、列挙型フィールドを列挙し、渡された値 switchに対応するクラスのインスタンスを作成するステートメントを記述します。enum

class CatFactory {
        public Cat createCat(CatType type) {
            Cat cat = null;
            
            switch (type) {
                case LION:
                    cat =  new Fluffy();
                    break;
                case TIGER:
                    cat = new Tiger();
                    break;
                case FLUFFY:
                    cat =  new Lion();
                    break;
            }
            
            return cat;
        }
    }
これであなたも工場長のように工場を経営できるようになります。:)

練習方法

読むことは良いことですが、コードを書くことはさらに良いことです。名前の文字数が偶数の場合は、独自の仮想ピッツェリアを作成してみてください。名前の文字数が奇数の場合は、仮想寿司バーを作成してみてください。名前がなかったら、あなたは幸運でした。今日はリラックスできます。
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION