【问题标题】:"Factory Method Design Pattern" in context of Java interfaces?Java接口上下文中的“工厂方法设计模式”?
【发布时间】:2016-08-03 05:14:02
【问题描述】:

我是 Java 初学者,我用来学习 Java 的那本书似乎有让我完全困惑的神秘例子和句子。

我了解什么是接口,以及如何/在何处应用该概念在现实世界中。但是什么是工厂方法?术语“工厂方法”是模棱两可的(JavaScript 对此有不同的含义),所以我提供了本书的 sn-p,以便让我的问题更清楚。代码如下:

interface Service {
    void method1();
    void method2();
}

interface ServiceFactory {
    Service getService();
}

Service 接口只是一个普通接口。 ServiceFactory 接口看起来像一个普通的接口,但它是一个“工厂方法”。那是什么?它解决了什么问题以及我为什么要使用它们?

【问题讨论】:

标签: java design-patterns interface factory-method


【解决方案1】:

工厂方法只是一种封装对象创建的方法。在您的示例中,您没有像通常那样使用 new 运算符来创建而不是 Service,而是在某个对象上使用了工厂方法。

ServiceFactory sf = new ServiceFactoryImpl();
// factory method
Service s = sf.getService();

为了更好地说明该方法的作用,可以改为createService。现在方法封装了Service的创建细节,你可以提供多种风格的方法(通过重载),你可以让它根据上下文返回不同的子类,或者传递给工厂方法的参数。

【讨论】:

    【解决方案2】:

    “工厂方法”是一种构造对象的方法。

    更具体地说,该术语通常指的是返回其声明类的实例(直接实例或子类的实例)的静态方法。根据我的经验,在某些情况下这种做法特别常见:

    • 如果您需要多个不同的构造函数,使用工厂方法可以为它们指定适当的名称(而对不同构造函数的调用只能通过参数类型来区分,这并不总是一目了然)。李>
    • 如果您需要一个抽象类的几个不同实现作为入口点,工厂方法可以实例化适当的子类型。
    • 如果您需要任何类型的缓存逻辑或共享实例,工厂方法可以处理它,并在适当的情况下返回一个已经存在的实例。
    • 如果您需要对副作用进行一些处理,可以以这样一种方式命名工厂方法,以便更清楚这些副作用是什么。

    因此,您的示例并不真正涉及“工厂方法”恕我直言,但您可以作弊并将 getService() 描述为一个。 (相反,我只是将ServiceFactory 描述为“工厂”)。ServiceFactory.getService() 的好处与工厂方法的好处相同,加上有一个实例而不是静态方法。

    【讨论】:

    • 应始终注意静态工厂方法与 GoF 工厂方法模式不同。两者完全不同。
    • @jaco0646:啊,你是对的。不过,OP 的示例似乎不是其中任何一个的示例。
    • 同意; factory 一词通常非常宽松地用于描述任何创建方法。然后将这个松散的术语与 GoF 或其他术语混为一谈,从而产生混淆。
    猜你喜欢
    • 2011-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-11
    • 1970-01-01
    • 1970-01-01
    • 2018-06-30
    • 1970-01-01
    相关资源
    最近更新 更多