简单工厂 vs 工厂方法

O. *_*dze 5 java oop design-patterns factory-method factory-pattern

简单工厂: 在此处输入图片说明

工厂方法:

在此处输入图片说明

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

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

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

1.客户端将加载对“NokiaFactory”的引用。但是 Client 不会像 Simple Factory 模式那样直接引用“NokiaFactory”类。客户端通过接口“IMobileFactory”引用具体实现。

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

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

我无法理解第一步:

但是 Client 不会像 Simple Factory 模式那样直接引用“NokiaFactory”类。客户端通过接口“IMobileFactory”引用具体实现。

所以客户写了这样的东西:

IMobileFactory factory = LoadFactory("NokiaFactory");
Run Code Online (Sandbox Code Playgroud)

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

NokiaFactory factory = new NokiaFactory();
Run Code Online (Sandbox Code Playgroud)

或者那怎么办:

IMobileFactory factory = new NokiaFactory();
Run Code Online (Sandbox Code Playgroud)

Ngh*_*Bui 6

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

IMobileFactory factory = LoadFactory("NokiaFactory");
Run Code Online (Sandbox Code Playgroud)

这个设计#2:

NokiaFactory factory = new NokiaFactory(); // or:
IMobileFactory factory = new NokiaFactory();
Run Code Online (Sandbox Code Playgroud)

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

了解诸如NokiaFactoryIPhoneFactory应该众所周知的具体事物的缺点。如果要对这些类型进行更改,例如,要向其中添加新方法NokiaFactory而该方法不是IMobileFactory接口的一部分,那么客户端代码将受到不必要的影响。客户端不关心新方法,但必须重新编译/重新部署其代码。

更新

解释更多。

例如,FooNokiaFactory类中添加了一个名为的新方法:

class NokiaFactory {
    // old code
    public void Foo() { ... }
}
Run Code Online (Sandbox Code Playgroud)

Foo不是IMobileFactory接口的方法,而是添加到其中,NokiaFactory因为有另一个客户端需要该方法,并且该客户端很乐意依赖于NokiaFactory类。换句话说,那个客户会欢迎NokiaFactory课堂上的变化,但第一个客户不会。


Dak*_*rra 5

从设计角度:

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

  • 当对象类型固定时使用工厂方法。例如:电话类型 - 座机和手机。

最后,这归结为希望如何设计您的系统。你想扩展什么。