"Factory Method Design Pattern" 在 Java 接口的上下文中?

"Factory Method Design Pattern" in context of Java interfaces?

我是 Java 的初学者,我用来学习它的书似乎有一些晦涩的例子和句子,让我完全困惑。

我了解什么是接口,how/where 可以在现实世界中应用该概念。但是什么是工厂方法?术语 "factory method" 含糊不清(JavaScript 对此有不同的含义)所以我提供了书中的片段,以明确我的问题。这是代码:

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

interface ServiceFactory {
    Service getService();
}

Service界面只是一个普通界面。 ServiceFactory 界面看起来像一个普通的界面,但它是一个"Factory Method"。那是什么?它解决了什么问题,为什么我应该使用它们?

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

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

为了更好地说明该方法的作用,可以将其称为createService。现在该方法封装了创建一个 Service 的细节,您可以提供多种方法(通过重载),您可以根据上下文或传递给它的参数将其 return 不同的子类工厂方法。

一个"factory method"是构造对象的方法

更具体地说,该术语通常指的是一种静态方法,该方法 returns 其声明 class 的实例(直接实例或子实例 class) .根据我的经验,有一些情况特别常见:

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

因此,您的示例并没有真正涉及 "factory method" 恕我直言,但您可以作弊并将 getService() 描述为一个。 (相反,我只是将 ServiceFactory 描述为 "factory" 就这样吧。)ServiceFactory.getService() 的好处与工厂方法的好处相同,plus 使用实例而不是静态方法的通常好处。