【问题标题】:Factory pattern implementation variations工厂模式实现变体
【发布时间】:2015-11-04 22:44:36
【问题描述】:

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

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

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

第一个例子也是工厂模式还是其他什么,应该使用还是不使用?

【问题讨论】:

标签: design-patterns factory factory-method


【解决方案1】:

但真正的工厂模式不是只有一个工厂吗? 每种产品类型?

如果“真正的工厂模式”是指 GoF Factory Method 模式,那么是的:GoF 模式指出,“子类决定实例化哪个类。 "

第一个例子也是工厂模式还是别的什么,

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

应该使用还是不使用?

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

【讨论】:

  • 关于 OCP:工厂方法也违反了开放/封闭原则,使用与此处相同的推理。每次添加新产品时都必须添加一个新的工厂类。此外,Singleton 模式与 OCP 几乎没有关系,但在 GoF 书中却有。此外,simple factory that uses reflection 不会也尊重 OCP 吗?我正在使用定义中声明它允许程序“在不修改其源代码的情况下扩展行为”的部分。
  • 感谢三位cmets。 1. 添加一个新的工厂类(通过子类化)将是遵守 OCP 的典型示例:现有工厂保持不变,即对扩展开放,对修改关闭。 2. 引用书中的内容,“当唯一的实例应该可以通过子类化扩展时,使用单例模式”, 这就是说单例应该是开放的以进行扩展。 3. 是的,反射当然可以用来满足 OCP。 GoF 侧重于组合和多态性。我不记得他们提到反射的任何模式。
【解决方案2】:

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

您在代码 sn-p 中的内容是工厂方法

【讨论】:

  • 如果您不赞成我的回答,请向我提供反馈。否则我将无法改进答案。
  • 代码 sn -p 不是工厂方法。根据 GoF,工厂方法依赖于继承。除了两种 GoF 工厂模式之外,还有其他退化版本(根据我的经验,这更常见)。这个 sn-p 是其他版本之一。
  • @jaco0646 模式只是建议,它们不会告诉你代码应该是什么样子,而是它应该如何表现。没有什么能比得上退化的模式版本。这是模式一词的唯一定义。
  • 工厂方法始终是来自客户端的多态调用。我最喜欢的例子是 Java 的 Collection.iterator() 方法。
  • 关于 degenerate patterns,我在 GoF 书中统计了七个引用,包括 degenerate factory 和两个对 degenerate iterator 的引用i>、简并桥简并复合。显然,有一些类似退化版本的模式。
猜你喜欢
  • 1970-01-01
  • 2016-02-01
  • 1970-01-01
  • 2016-08-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多