工厂方法与抽象工厂

时间:2013-12-27 11:10:03

标签: java design-patterns abstract-factory factory-method

我已经阅读了Factory Method,其中Sub类创建了所需的Object,而Abstract Factory有方法,其中具体类创建了所需的Object

工厂方法

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实现的相同用例。为什么应该有FactoryMethod而不是使用Abstract Factory或Utility Factory(例如Chicago Factory / NewYorkFactory)。在哪种情况下,Factory方法对抽象方法很有用?

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

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

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

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