0

サブクラスが必要なオブジェクトを作成し、抽象ファクトリには具象クラスが必要なオブジェクトを作成するメソッドがあるファクトリメソッドについて読みました

工場方式

public class PizzaStore {

    public Pizza orderPizza(String type) {
        Pizza pizza = createPizza(type);
        pizza.prepare();
        pizza.bake();
        pizza.cut();
    }

    abstract Pizza createPizza(String type);

}

public NewYorkPizzaStore extends PizzaStore {

    public Pizza createPizza(String type) {
        Pizza pizza = null;
        if("cheese".equals(type)) {
            pizza = new CheesePizza();
        }
        else if("onion".equals(type)) {
            pizza = new OnionPizza();
        }

        return pizza;
    }

}

public class pizzaTestDriveByFactoryMethod() {

    public static void main(String args[]) {
        PizzaStore ps =  new NewYorkPizzaStore();
        ps.orderPizza("cheese");
    }

}

工場の使用

public class NewYorkPizzaFactory extends PizzaFactory {

    public Pizza createPizza(String pizza) {
        Pizza pizza = null;
        if("cheese".equals(type)) {
            pizza = new CheesePizza();
        } else if("onion".equals(type)) {
            pizza = new OnionPizza();
        }

        return pizza;
    }

}

public class PizzaStore {

    PizzaFactory factory;

    public PizzaStore(PizzaFactory factory) {
        this.factory =  factory
    }

    public Pizza orderPizza(String type) {
        Pizza pizza =  factory.createPizza(type)
        pizza.prepare();
        pizza.bake();
        pizza.cut();
        return pizza;
    }

}

public class pizzaTestDriveByAbstractFactory() {

    public static void main(String args[]) {
        PizzaFactory nwFactory = new NewYorkPizzaFactory();
        PizzaStore ps =  new PizzaStore(nwFactory);
        ps.orderPizza("cheese");
    }

}

Factory Method と Abstract Factory を使用して実装された同じユース ケース。Abstract Factory または Utility Factory (Chicago Factory/NewYorkFactory など) を使用する代わりに、FactoryMethod を使用する必要がある理由。どの場合、ファクトリ メソッドは抽象メソッドに役立ちますか?

4

2 に答える 2

1

主な違いは、ファクトリを処理しているオブジェクトをサブクラス化する必要なく、ファクトリ オブジェクトを実装できることです。これはまた、その場で工場のスワップなどを行うことができることを意味します。一方、単純な、または密接に結合された何かを行っているだけの場合は、より単純なメソッドを提供することもできます。

于 2013-12-27T11:47:41.870 に答える
0

ファクトリ タスクが基本クラスやサブクラス (createPizza など) に概念的に関連付けられているかどうか (procurePizzaBoxes など) を確認する必要があります。ピザ ボックス サプライヤーは、概念的に異なるだけでなく、入れ替えることができます。それは、すべての都市にピザの箱を供給する 1 つの全国的な会社でさえあるかもしれません。

決定するもう 1 つの方法は、ファクトリ メソッドを実装するためだけにサブクラスを作成している場合は、それを抽象ファクトリに分解する方がよいということです。

ただし、サブクラスに独自の特性があり、関係なく存在する必要があり、メソッドの実装がそれらに関連付けられている場合 (たとえ procurePizzaBoxes であっても、サプライヤーはローカルであり、重要な詳細ではありません)、ファクトリ メソッドを使用する必要があります。ポリモーフィズムとオブジェクト指向の自然な適用として、そしてクラスのカウントダウンを維持するために。

ファクトリ メソッドから抽象ファクトリへのリファクタリングは、おそらくその逆よりも簡単であり、必要なクラスが少ないため、より保守的な選択と見なすことができます。

于 2013-12-27T12:19:26.813 に答える