工厂方法与抽象工厂

Posted

技术标签:

【中文标题】工厂方法与抽象工厂【英文标题】:Factory Method Vs Abstract Factory [duplicate] 【发布时间】:2014-01-14 23:36:37 【问题描述】:

我已经阅读了工厂方法,其中子类创建所需的对象,抽象工厂具有具体类创建所需对象的方法

工厂方法

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)。什么情况下工厂方法对抽象方法有用?

【问题讨论】:

这里有问题吗? 我已经看到提供的链接。但我不明白为什么要使用 factoryMethod 而不是 AbstractFactory。 你和我的工厂有非常相似的问题。我们都阅读了 HF 设计模式,创建模式,但并不理解它们。但对我来说还有一件事不清楚,这就是这两种模式与本书同一章节中定义的简单工厂习语之间的区别(以及它的示例 SimpleFactory 类)。在工厂成语(p.118/119)的结尾,他们说你可以用 NYPizzaFactory 或 ChPizzaFactory 代替 SimpleFactory - 对我来说这听起来像抽象工厂? 这里csc.columbusstate.edu/woolbright/java/factory.html 有HF 设计模式的摘录,这里***.com/questions/20848082/… 链接到我的问题。 【参考方案1】:

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

【讨论】:

所以,你说 AbstractFactory 比 factoryMethod 更有优势。那么工厂方法比抽象工厂有什么用。 工厂方法更简单。抽象(或接口)工厂更强大。使用您的案例所需的那个。【参考方案2】:

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

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

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

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

【讨论】:

您能否举例说明“但是如果子类有自己的特点,无论如何都需要存在,并且方法的实现与它们相关联”。我想不出这种情况。 @ksv 假设 PizzaStore 子类不简单地覆盖 orderPizza,而是覆盖许多方法并提供新方法。也许 NewYorkPizzaStore 会覆盖 orderGarlicKnots 并添加 requestMafiaProtection。因此,不要使用 PizzaStore、NewYorkPizzaStore、NewYorkPizzaFactory 和 NewYorkGarlicKnotFactory,而是使用工厂方法。这将使班级人数减少一半。请记住,您的目标是可读性和可维护性,而通过添加大量您(尚)不需要的可扩展点来“过度设计”会适得其反。

以上是关于工厂方法与抽象工厂的主要内容,如果未能解决你的问题,请参考以下文章

工厂方法与抽象工厂

java抽象工厂的使用意图是啥?

工厂模式与抽象工厂的区别

工厂方法与抽象工厂

设计模式——简单工厂工厂方法与抽象工厂

设计模式系列-Builder模式,工厂方法模式和抽象工厂模式