工場モード

22182 ワード


ソース

構想の対象

Member member = new memberRepoistory()
新しいメンバーにオブジェクトを宣言するときにnewを使用します.newはオブジェクトを構成することを意味する.
前述したように、構成対象に依存するスロー符号化は、良い符号化ではない.
これは役に立ちますが、OCPの原則に従うことができず、新しいインプリメンテーションクラスを追加するときにコードの変更(変更)を変更する必要があると、コードが閉じます.そこで、まず変化した部分をカプセル化します.
この過程を単純工場と呼ぶ.

Simple Factory


シンプルファクトリモードとは、オブジェクトを生成するファクトリを個別に作成することです.
Pizzaオブジェクトが下部に表示されます.
public class PizzaStore {
    SimplePizzaFactory factory;
    public PizzaStore (SimplePizzaFactory factory) {
        this.factory = factory;
    }
    public Pizza orderPizza (String type) {
        Pizza pizza; pizza = factory.createPizza(type);
        pizza.prepare();
        pizza.bake();
        pizza.cut();
        pizza.box();
        return pizza;
    }
}
public class PizzaFactory {
    public Pizza createPizza(String type) {
        Pizza pizza = null;
        if( type.equals("cheese") )
            pizza = new CheesePizza();
        else if( type.equals("pepperoni") )
            pizza = new PepperoniPizza();
        else if( type.equals("calm") )
            pizza = new ClamPizza(); return pizza;
    }
}
このようにピザオーダーは、受け取ったpizzaStoreオブジェクトと生成したpizzaFactoryで区別されるのが単純ファクトリモードです.
オブジェクトの作成部分が変化しても簡単に変更できるように、オブジェクトとオブジェクトの作成を区別できるという利点があります.

Factory Method Pattern



今回作るコードはピザを作るコードです.
package pizzaria;

import java.util.ArrayList;

public abstract class Pizza {
    String name;
    String dough;
    String sauce;
    ArrayList toppings = new ArrayList();

    void prepare() {
        System.out.println("Preparing " + name);
        System.out.println("Tossing Dough...");
        System.out.println("Adding sauce...");
        System.out.println("Adding topppings: ");
        for (Object topping : toppings) {
            System.out.println(" " + topping);
        }
    }
    void bake() {
        System.out.println("Bake for 25 mins at 350");
    }
    void cut() {
        System.out.println("cutting the pizza into diagonal slices");
    }
    void box() {
        System.out.println("Place pizza in official Pizzastore Box");
    }
    public String getName() {
        return name;
    }
}
ピザの抽象レベル.
package pizzaria;

public abstract class PizzaStore {
    public Pizza orderPizza(String type) {
        Pizza pizza;
        pizza = createPizza(type);
        pizza.prepare();
        pizza.bake();
        pizza.cut();
        pizza.box();

        return pizza;
    }

    protected abstract Pizza createPizza(String type);
}
ピザ屋の抽象的な等級を区別するためだ.
この抽象クラスではcreatePizzaを工場化している.
ファクトリ化のためにProtectedを使用して保護し、インプリメンテーションクラスを個別に作成します.
createPizzaを担当するオブジェクトを作成し、そのオブジェクトのすべての内容を処理します.このような設計により、createPizzaを他のPizzaStoreに使用することができ、変動があれば保護することができます.
package pizzaria;

public class NYPizza extends PizzaStore{

    public Pizza createPizza(String item) {
        if (item.equals("cheese")) return new NYstyleCheesePizza();
        else return null;
    }
}
このコードは、createPizzaを具体的に実装するコードです.
package pizzaria;

public class NYstyleCheesePizza extends Pizza {
    public NYstyleCheesePizza() {
        name = "NY Style Cheese Pizza";
        dough = "Thin Crust Dough";
        sauce = "Marinara Sauce";

        toppings.add("Grated Reggiano Cheese");
    }

    @Override
    void cut() {
        System.out.println("Cut in Triangle");
    }
}
このコードは、選択したピザに対するもう一つの具体的な実装コードである.
package pizzaria;

public class PizzaTestDriver {
    public static void main(String[] args) {
        PizzaStore ps = new NYPizza();
        Pizza pizza = ps.orderPizza("cheese");
        System.out.println(pizza.getName() + "\n");
    }
}
全体を次のように実行します.
確定
  • ピザ屋(NYPizza)
  • この店でピザオブジェクトを通じてチーズピザ
  • を注文
  • OrderPizzaオブジェクトからCreatePizzaを呼び出し、NYPizza上にあるCreatePizzaで
  • を実行します.
  • if文の条件を満たす適切なクラス(NYStyleCheesePizza)
  • を返す
  • 終了
  • 注意事項
    1.ピザオブジェクトを返すため、関数はすべてPizza createPizzaの形式です.
    2.完璧なOCP、DIPではありません.

    説明:


    ファクトリメソッドモードでは、オブジェクトの作成を担当するファクトリを部分的にインスタンス化し、サブクラスにオブジェクトの作成を委任します.
    作成メソッドcreatePizza()を抽象メソッドとして宣言し、各ピザ店で管理するように設定します.この構造が工場方法モデルである.
    このモードを使用すると、PizzaStoreのフレーム全体(prepare、box、cut、生地)を一定に保つことができ、各オブジェクトに特性があります.
    すべてのファクトリモードでオブジェクトがカプセル化されます.

    Creator


    PizzaStoreとそれを受け継ぐピザ屋はすべて生産者級です.

    Product


    Pizzaのフレーム類とそのサブピザ類はいずれも製品類である.
    クリエイターを工場、製品を工場で生産された商品と理解すれば簡単です
    この2つの方法は互いに関連しており,orderPizzaと呼ばれ,並列に表すことができる.

    オブジェクト依存性とオブジェクト反転


    依存する対象はOCPの原則に反する.
    一方が変わり、他方も変わります.これはコード変更の需要が多すぎるからです.
    したがって,修正しやすい部分と修正しにくい部分を別々に書くことが重要である.そこで,前の記事でまとめたように,変更が頻繁に発生する部分を抽象化し,各売場クラスに反映させ,残りは抽象クラスで処理する.

    DIP


    これは依存性の原則を覆すことだ.これは,具体化されたクラスではなく抽象に頼ることを意味する.
    前の文章で書いたコードはこのような依存関係を持っている.

    ファクトリメソッドを使用して変更する場合は、Pizza抽象クラスが存在し、残りのすべてのクラスはPizzaに依存するように変更する必要があります.
    もちろん、このすべてを100%守るのは難しいし、実際には必要ありません.これは、可能であれば守ったほうがいいという意味で、最大限に変えた部分はカプセル化されます.