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

2023-12-06

这与 Joshua Bloch 所著的《Effective Java》一书中的创建和销毁对象有关

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

此方法将布尔原始值转换为布尔对象引用:

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

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

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

阿萨进一步的问题,BalusC 提及在这个线程中,工厂方法下的链接,java.util.Calendar#getInstance()这是一个静态工厂方法,表明静态工厂方法是工厂方法模式的子集。


工厂方法模式

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

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

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

静态工厂方法

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

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

上面的代码是什么意思?

Is newList的副本otherList或者是ArrayList保留一个参考otherList并且只是将调用委托给它(就像包装器一样)?

我想每个人都知道上面的代码做了什么,因为我们阅读了javadoc。尽管如此,如果使用静态工厂方法,代码会更清晰,而无需阅读javadoc。例如。

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

使用静态工厂方法,还可以使用相同的参数列表编写多个“构造函数”,因为您可以给每个人另一个名称。使用“普通”构造函数这是不可能的。例如。

List<String> copy = ArrayList.copyOf(otherList);
List<String> delegateList = ArrayList.delegateOf(otherList);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐