什么是静态工厂方法?
什么是“静态工厂”方法?
静态工厂方法模式是一种封装对象创建的方法。如果没有工厂方法,只需直接调用类的构造函数:。使用此模式,您可以改为调用工厂方法:。构造函数被标记为私有,因此除非从类内部调用,否则无法调用它们,并且工厂方法被标记为静态
,以便无需首先具有对象即可调用它。Foo x = new Foo()
Foo x = Foo.create()
此模式有一些优点。一个是工厂可以从许多子类(或接口的实现者)中进行选择并返回。这样,调用方可以通过参数指定所需的行为,而不必知道或理解潜在的复杂类层次结构。
正如马修和詹姆斯所指出的那样,另一个优点是控制对有限资源(如连接)的访问。这是一种实现可重用对象池的方法 - 而不是构建,使用和拆除对象,如果构造和破坏是昂贵的过程,那么构建它们一次并回收它们可能更有意义。如果工厂方法具有现有的未使用的实例化对象,则该方法可以返回该对象;如果对象计数低于某个阈值下限,则可以构造一个实例化对象;如果对象计数高于阈值上限,则引发异常或返回。null
根据维基百科上的文章,多个工厂方法也允许对类似的参数类型进行不同的解释。通常,构造函数与类具有相同的名称,这意味着您只能有一个具有给定签名的构造函数。工厂没有那么受约束,这意味着你可以有两个不同的方法接受相同的参数类型:
Coordinate c = Coordinate.createFromCartesian(double x, double y)
和
Coordinate c = Coordinate.createFromPolar(double distance, double angle)
这也可以用来提高可读性,正如Rasmus所指出的那样。
注意!“静态工厂方法与工厂方法模式不同”(c)有效的Java,Joshua Bloch。
工厂方法:“定义一个用于创建对象的接口,但让实现该接口的类决定要实例化的类。Factory 方法允许类将实例化推迟到子类“(c) GoF。
“静态工厂方法只是一个返回类实例的静态方法。(c) 《有效的爪哇》,约书亚·布洛赫。通常,此方法位于特定类中。
区别:
静态工厂方法的关键思想是获得对对象创建的控制,并将其从构造函数委托给静态方法。要创建的对象的决策类似于在方法外部进行的抽象工厂(在常见情况下,但并非总是如此)。而工厂方法的关键(!)思想是委托决定在工厂方法中创建哪个类实例。例如,经典的单例实现是静态工厂方法的一个特例。常用的静态工厂方法示例: