【问题标题】:Simple factory vs Factory method简单工厂 vs 工厂方法
【发布时间】:2018-11-19 10:04:24
【问题描述】:

简单工厂:

工厂方法:

大家好。我正在寻找简单工厂和工厂方法之间的区别。我知道结构差异(上图),但我无法理解用例的差异。例如,这是对工厂方法的解释:

在工厂方法模式中,我们将引入一个名为的新接口 ‘IMobileFactory’和两个具体实现的‘NokiaFactory’和 “苹果工厂”。这些具体的类控制对象的创建。

在我的示例中,客户想要一个诺基亚对象。所以给出了步骤 下面。

1.客户端将加载对‘NokiaFactory’的引用。但是客户端不会像简单工厂那样直接引用“诺基亚工厂”类 图案。客户通过 接口‘IMobileFactory’。

2.然后客户端调用“CreateMobile()”方法,该方法将返回一个“IMobile”类型的对象。

3.这里我们要通过一些配置或参数告知客户端要使用的具体实现。

第一步看不懂:

但客户端不会像 简单的工厂模式。客户参考具体实现 通过接口“IMobileFactory”。

所以客户端会这样写:

IMobileFactory factory = LoadFactory("NokiaFactory");

那么为什么它有用且更好呢?有什么好处?为什么我不应该写这个:

NokiaFactory factory = new NokiaFactory();

或者那又如何:

IMobileFactory factory = new NokiaFactory();

【问题讨论】:

  • 两者都不是真正的粉丝;我宁愿作者在构造函数调用期间注入对IMobileFactory 实例的引用。无论哪种方式,目标都是避免直接引用具体类并使用接口。使用接口将使您的代码更灵活地用于测试/新用例,因为它不与单个实现耦合。

标签: java oop design-patterns factory-pattern factory-method


【解决方案1】:

所以你的问题是关于比较这个设计#1:

IMobileFactory factory = LoadFactory("NokiaFactory");

这个设计#2:

NokiaFactory factory = new NokiaFactory(); // or:
IMobileFactory factory = new NokiaFactory();

如您所见,最大的不同在于,虽然设计#1 中的客户端知道任何具体类型,例如 NokiaFactoryIPhoneFactory,但设计#2 中的客户端可以。

了解NokiaFactoryIPhoneFactory 等具体事物的不利之处应该是众所周知的。如果您想对这些类型进行更改,例如,您想向NokiaFactory 添加一个新方法并且该方法不是IMobileFactory 接口的一部分,那么客户端代码将受到影响不必要地。客户端不关心新方法,但它的代码必须重新编译/重新部署。

更新

解释更多。

例如,一个名为Foo 的新方法被添加到NokiaFactory 类中:

class NokiaFactory {
    // old code
    public void Foo() { ... }
}

Foo 不是IMobileFactory 接口的方法,但它被添加到NokiaFactory,因为有另一个客户需要该方法,并且该客户很乐意依赖NokiaFactory 类。换句话说,该客户端会欢迎来自 NokiaFactory 类的更改,但第一个客户端不会。

【讨论】:

  • 我无法理解这部分:“你想向 NokiaFactory 添加一个新方法,而这个方法不是 IMobileFactory 接口的一部分,那么客户端代码将受到不必要的影响”。你能解释清楚吗?
【解决方案2】:

从设计角度:

  • 当对象的类型不固定时使用 SimpleFactory。例如:手机我的制造商 - 诺基亚、iPhone。也许你明天想添加一个新的制造商。

  • 当对象的类型固定时使用工厂方法。例如:按类型划分的电话 - 固定电话和移动电话。

最后,归结为想要如何设计您的系统。你想要什么是可扩展的。

【讨论】:

  • binpress.com/factory-design-pattern/… 根据本文,反之亦然
  • 据我了解这篇文章,它说的和我在这里提到的一样。按位置对玩具使用工厂方法,按类型对玩具使用 SimpleFactory。
  • 起初您似乎在说工厂方法的可扩展性不如简单工厂。然后我意识到工厂方法在每个具体工厂中都有一个简单的工厂,这使得我之前的句子不可能
【解决方案3】:

您需要接口以避免为每种类型创建不同的流程,对于 10 种类型,您将有 1 行代码而不是 10 行代码

IMobileFactory factory = loadFactory(myFactoryName);

而不是按类型:

NokiaFactory factory = new NokiaFactory();
...
IphoneFactory factory = new IphoneFactory();
...

使用loadFactory 方法与new NokiaFactory() 的区别在于您不需要显式创建新对象,您将对象创建委托给返回相关对象的loadFactory

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多