首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >工厂方法与抽象工厂

工厂方法与抽象工厂
EN

Stack Overflow用户
提问于 2013-12-27 11:10:03
回答 2查看 1.2K关注 0票数 0

我读过工厂方法,其中子类创建需要的对象,抽象工厂有具体类创建所需对象的方法

工厂法

代码语言:javascript
复制
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");
    }

}

使用工厂

代码语言:javascript
复制
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而不是使用抽象工厂或实用程序工厂(比如芝加哥工厂/纽约工厂)。在哪种情况下,工厂方法对抽象方法是有用的?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-12-27 12:19:26

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

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

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

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

票数 0
EN

Stack Overflow用户

发布于 2013-12-27 11:47:41

主要的区别是,您可以实现一个工厂对象,而不需要对处理工厂的对象进行子类处理。这也意味着你可以马上做一些像交换工厂之类的事情。另一方面,如果您只是做一些简单或紧密耦合的事情,那么您最好提供方法,就像提供更简单的方法一样。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20799645

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档