"工厂方法设计模式"在Java接口的上下文中?

时间:2016-08-03 05:14:03

标签: java design-patterns interface factory-method

我是Java的初学者,我用来学习它的书似乎有一些神秘的例子和句子让我感到很困惑。

我了解接口是什么以及在现实世界中如何/在何处应用该概念。但什么是工厂方法?术语"工厂方法"是不明确的(JavaScript有不同的含义)所以我提供了该书的代码片段,以便明确我的问题。这是代码:

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

interface ServiceFactory {
    Service getService();
}

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

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

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

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

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

所以,你的例子并不真正涉及“工厂方法”恕我直言,但你可以作弊并将getService()描述为一个。 (相反,我只是将ServiceFactory描述为“工厂”,并将其留在那里。)ServiceFactory.getService()的好处与工厂方法的好处相同, plus 使用实例而不是静态方法的常见好处。