【问题标题】:What are the disadvantages of Simple Factory, compared to Factory Method pattern and Abstract Factory Pattern respectively?与工厂方法模式和抽象工厂模式相比,简单工厂的缺点是什么?
【发布时间】:2019-06-12 18:26:13
【问题描述】:

Head First Design Patterns 将简单工厂描述为

public class SimplePizzaFactory {
    public Pizza createPizza(String type) {
        Pizza pizza = null;
        if (type.equals(“cheese”)) {
            pizza = new CheesePizza();
        } else if (type.equals(“pepperoni”)) {
            pizza = new PepperoniPizza();
        } else if (type.equals(“clam”)) {
            pizza = new ClamPizza();
        } else if (type.equals(“veggie”)) {
            pizza = new VeggiePizza();
        }
        return pizza;
    }
}

与工厂方法模式和抽象工厂模式相比,简单工厂的缺点是什么?

在 Gamma 等人的 Design Patterns 中,工厂方法模式中的类参数化工厂方法看起来类似于简单工厂。参数化的抽象工厂完全是简单工厂是否正确? 设计模式是否提到参数化抽象工厂?

【问题讨论】:

  • 工厂方法适用于代码从不改变的情况(例如,Guava 的Collections2.newLinkedList() 在我编写的所有应用程序中都没有改变)。 (简单)工厂适用于您想要添加新结果但对象的构造基本相同的情况。如果整个构造过程根据结果对象的实际实现而变化,则为抽象工厂。

标签: design-patterns factory


【解决方案1】:

与工厂方法模式和抽象工厂模式相比,简单工厂的缺点是什么?

将工厂方法模式与抽象工厂模式进行比较并不完全正确,因为它们的用途不同。工厂方法只是创建一个对象,而抽象工厂模式定义了一个接口,您可以通过该接口创建对象系列。如果我没记错的话,两者都在您正在阅读的书中进行了描述。

回到简单工厂与工厂方法的劣势:在谈论设计模式时,始终关注的是哪种设计模式以及如何将它们应用于您的特定问题,这取决于具体情况。

为您想要创建的每种对象类型拥有一个工厂类会增加代码的复杂性,并且每个对象系列附近都会有一个工厂类,因此您的代码很快就会因 Factory 类而爆炸式增长。如果模式应用正确,这是我所知道的唯一缺点。当然,另一方面,工厂方法也有其缺点。在两者之间进行选择时,我总是问自己谁是代码的客户以及他更容易使用什么。

在 Gamma 等人的设计模式中,工厂方法模式中的类参数化工厂方法似乎类似于简单工厂。参数化的抽象工厂完全是简单工厂是否正确?设计模式是否提到参数化抽象工厂?

并非如此,但 AbstractFactory 的具体工厂实现确实看起来像简单工厂。

我建议你也阅读其他文章,我个人更喜欢 Zoran 关于抽象工厂的帖子和讲座。在此处查看示例: http://codinghelmet.com/articles/cascading-abstract-factories

【讨论】:

    【解决方案2】:

    简单工厂有一个工厂类,该工厂类具有一个创建方法,该方法具有很大的条件,基于方法参数选择要实例化的产品类(简单工厂不是设计模式)。

    简单工厂示例:

    class UserFactory {
    public static function create($type) {
        switch ($type) {
            case 'user': return new User();
            case 'customer': return new Customer();
            case 'admin': return new Admin();
            default:
                throw new Exception('Wrong user type passed.');
        }
    }
    

    }

    【讨论】:

      最近更新 更多