2016-08-03 101 views
1

我是一名Java初学者,我用来学习它的书似乎有一些神秘的例子和句子,让我完全迷惑。Java接口上下文中的“工厂方法设计模式”?

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

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

interface ServiceFactory { 
    Service getService(); 
} 

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

+0

严格来说,'ServiceFactory'也是一个“普通”接口。工厂方法需要某种实现(从Java 8开始,这可以是接口中的默认方法),因为它需要生成(创建)某种类型的实例(因此称为“工厂”)。您*可以*在接口中指定工厂方法,但仍然需要一个具体的Factory类来创建特定的类型。请参阅https://en.wikipedia。org/wiki/Factory_method_pattern –

+0

[Design Patterns:Factory vs Factory method vs Abstract Factory]可能的副本(http://stackoverflow.com/questions/13029261/design-patterns-factory-vs-factory-method-vs-abstract-工厂) – jaco0646

回答

0

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

更具体地说,该术语通常指的是返回其声明类(直接实例或子类实例)的实例的静态方法。根据我的经验,存在令人极其常见的做了几个案例:

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

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

+1

应该始终注意静态工厂方法与GoF工厂方法模式不一样。两者完全不同。 – jaco0646

+0

@ jaco0646:啊,你说得对。尽管如此,OP的例子似乎并不是任何一个例子。 – ruakh

+1

同意;术语_factory_通常用于非常松散地描述任何创建方法。然后将这个松散的术语与GoF或其他术语混淆起来,并产生混淆。 – jaco0646

1

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

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

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