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");
    }

}

使用工厂方法和抽象工厂实现的相同用例。为什么应该有 FactoryMethod 而不是使用 Abstract Factory 或 Utility Factory(例如 Chicago Factory/NewYorkFactory)。在哪种情况下工厂方法对抽象方法有用?

4

2 回答 2

1

主要区别在于您可以实现工厂对象,而无需对您正在处理工厂的对象进行子类化。这也意味着您可以即时执行交换工厂之类的操作。另一方面,如果您只是在做一些简单或紧密耦合的事情,那么您不妨只提供更简单的方法。

于 2013-12-27T11:47:41.870 回答
0

您应该询问工厂任务在概念上是否与基类和/或子类(如 createPizza)相关联(如 procurePizzaBoxes)。披萨盒供应商不仅在概念上不同,而且可以互换。它甚至可能是一家全国性公司,为每个城市提供披萨盒。

另一种决定方法是,如果您创建子类只是为了实现工厂方法,那么最好将其分解为抽象工厂。

但是如果子类有自己的特点,无论如何都需要存在,并且方法的实现与它们绑定(即使是procurePizzaBoxes,但供应商是本地的,不是重要的细节),那么你应该使用工厂方法作为多态性和 OO 的自然应用,并保持类倒计时。

从工厂方法重构为抽象工厂可能比反过来更容易,并且需要的类更少,因此可以认为是更保守的选择。

于 2013-12-27T12:19:26.813 回答