工厂模式实现变体

Factory pattern implementation variations

我看到很多人使用这样的东西,并称之为工厂模式。

class Factory {
    public IProduct Create (ProductEnum type) {
        switch (type) {
            case ProductAType:
                return new ProductA();
            case ProductBType:
                return new ProductB();
        }
    }
}

但真正的工厂模式不就是每种产品类型都有一个工厂吗?因此,当您创建 IProduct 的新实现时,您必须创建一个新工厂 class 并重新定义 Create 方法。类似于这张图片:

第一个例子是工厂模式还是别的东西,到底该不该用?

其实有两种工厂模式。第一个叫做工厂方法,图中显示的第二个是抽象工厂。谈论 工厂模式 的人通常不知道其中之一或不理解其中的区别。在这里描述差异会浪费时间,因此我将向您指出 this SO 问题以开始。互联网上显然有更多。

代码片段中的内容是工厂方法

But isn't the real Factory pattern the one where you have one factory for each product type?

如果 "real Factory pattern" 你的意思是 GoF Factory Method 模式,那么是的:GoF 模式指出,“subclasses 决定实例化哪个 class。"

Is the first example also Factory pattern or it is something else,

第一个例子不是 GoF 模式,但它很常用,通常被称为工厂。您可能还会看到它被称为简单工厂,或者如果该方法是静态的,则称为静态工厂,以将其与 GoF 区分开来。如果不区分 GoF 模式和相关(但非官方)的编码习语,就会造成混乱。

and should that be used or not?

您不会在 GoF 模式中看到这样的习语的原因是它违反了 open/closed principle。每次添加新产品时都必须修改同一个工厂 class,而不是根据 GoF 通过继承和多态性添加产品。您必须自己判断违反 open/closed 原则的简单性是否超过潜在的可维护性。