简单工厂与工厂方法

时间:2018-11-19 10:04:25

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

简单工厂: enter image description here

工厂方法:

enter image description here

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

  

在Factory Method模式中,我们将引入一个名为   “ IMobileFactory”和两个具体的实现“ NokiaFactory”以及   “ IphoneFactory”。这些具体的类控制对象的创建。

     

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

     

1。客户端将加载对“ NokiaFactory”的引用。但是客户不会像简单工厂那样直接引用“ NokiaFactory”类   图案。客户通过   界面“ IMobileFactory”。

     

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

     

3。在这里,我们必须通过一些配置或参数来通知客户端要使用的具体实现。

我不明白第一步:

  

但是客户不会像这样直接引用“ NokiaFactory”类   简单的工厂模式。客户参考具体实施   通过界面“ IMobileFactory”。

因此客户端编写如下内容:

IMobileFactory factory = LoadFactory("NokiaFactory");

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

NokiaFactory factory = new NokiaFactory();

或者那样:

IMobileFactory factory = new NokiaFactory();

3 个答案:

答案 0 :(得分:2)

您需要使用界面以避免每种类型创建不同的流,对于10种类型,您将拥有1行代码,而不是10行

IMobileFactory factory = loadFactory(myFactoryName);

代替每种类型:

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

loadFactory方法用于new NokiaFactory()的区别在于,您无需显式创建新对象,而将对象创建委托给loadFactory即可返回相关对象

答案 1 :(得分:2)

所以您的问题是关于比较设计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,因为还有另一个客户端需要该方法,并且该客户端很乐意依赖{{ 1}}类。换句话说,该客户端将欢迎NokiaFactory类的更改,但第一个客户端则不会。

答案 2 :(得分:0)

从设计的角度来看:

  • 当对象类型不固定时,请使用SimpleFactory。例如:给我的制造商打电话-诺基亚,iPhone。也许您明天想添加新的制造商。

  • 在固定对象类型时使用Factory方法。例如:按类型的电话-固定电话和移动电话。

最后,这取决于如何设计系统。您想扩展的内容。