Joshua Bloch #Item 1:考虑静态工厂方法而不是构造函数

时间:2016-07-25 07:16:39

标签: java design-patterns factory factory-pattern

这与创建和销毁本书中的对象有关[' Effective Java'作者:Joshua Bloch

第1项:考虑静态工厂方法而不是构造函数

此方法将布尔基元值转换为布尔对象引用:

public static Boolean valueOf(boolean b) {
    return b ? Boolean.TRUE : Boolean.FALSE;
}
  

请注意,静态工厂方法与Factory不同   设计模式中的方法模式[Gamma95,p。 107]。静电   本项目中描述的工厂方法没有直接等效的   设计模式。

作者似乎在谈论静态工厂方法和工厂方法模式之间的区别。这有什么区别?

另外,BalusC 提到in this thread,工厂方法下的链接,java.util.Calendar#getInstance()这是一个静态工厂方法,因此建议静态工厂方法是工厂方法模式的子集。

3 个答案:

答案 0 :(得分:5)

工厂方法模式

工厂方法是用于创建对象的接口。此接口的具体实现指定要创建的具体对象。

工厂方法模式在客户端必须实例化对象时使用,但它不应该知道它是如何创建的。

  +------------+       uses        +-------------+
  |   Client   |    ---------->    |   Factory   |
  +------------+                   +-------------+
        | uses                     | create()    |
        V                          +-------------+
  +------------+                          ^
  | SomeObject |                          |
  +------------+                          |
        ^                                 |
        |                                 |
+--------------------+   create  +------------------+
| SomeConcreteObject | <-------- | ConcreateFactory |
+--------------------+           +------------------+

静态工厂方法

静态工厂方法模式是一种编写干净代码的方法。这是一种为构造函数提供更有意义的名称来表达它的功能的方法。 E.g。

List<String> newList = new ArrayList<String>(otherList);

上面的代码是什么意思?

newListotherList的副本还是ArrayList保留otherList的引用,只是委托对它的调用(如包装器)?

我想每个人都知道上面代码的作用,因为我们读了javadoc。然而,如果使用静态工厂方法,则代码在不读取javadoc的情况下会更清晰。 E.g。

List<String> copy = ArrayList.copyOf(otherList);
SortedSet<SomeObject> sortedSet = TreeSet.orderedBy(comparator);

使用静态工厂方法,也可以编写多个构造函数&#39;使用相同的参数列表,因为您可以为每个人提供另一个名称。使用&#39; normal&#39;这是不可能的。构造函数。 E.g。

List<String> copy = ArrayList.copyOf(otherList);
List<String> delegateList = ArrayList.delegateOf(otherList);

答案 1 :(得分:1)

Google在搜索结果(来自维基百科)中弹出的工厂方法模式的定义是:

  

定义。 “定义用于创建对象的接口,但让子类决定实例化哪个类.Plant方法允许类将其用于子类的实例化延迟。

这里的关键是工厂作为接口传递给需要创建实例的类。这意味着可以实现工厂方法的多种实现。

静态工厂方法使用静态方法:该方法是静态引用的,而不是通过接口引用的。这意味着工厂方法只有一种实现方式。

答案 2 :(得分:0)

以下是“设计模式中的工厂方法模式”的定义[Gamma95,p。 107]” “定义用于创建对象的接口,但让子类决定实例化哪个类.Plant方法允许类将它用于子类的实例化延迟。”

模式不是单个静态方法,而是一个将被调用的接口(或抽象)方法,具体取决于实现它的类。

请查看以下示例:Factory method pattern

由于我们讨论的是设计模式,请记住上面的示例包含不良做法(从构造函数中调用抽象方法)。

请参阅:Is it OK to call abstract method from constructor in Java?