【问题标题】:Joshua Bloch #Item 1: Consider static factory methods instead of constructorsJoshua Bloch #Item 1:考虑静态工厂方法而不是构造函数
【发布时间】:2016-11-28 10:34:21
【问题描述】:

这与 Joshua Bloch 的“Effective Java”一书中的创建和销毁对象有关

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

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

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

请注意,静态工厂方法与工厂方法不同 来自设计模式的方法模式 [Gamma95, p. 107]。静态的 此项中描述的工厂方法在 设计模式。

作者好像在说静态工厂方法和工厂方法模式的区别。这里到底有什么区别?

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

【问题讨论】:

  • 这可能会有所帮助。stackoverflow.com/questions/8147163/…
  • 不太确定,但是这个静态工厂方法的实例不返回 new 实例。它用已经创建的相应对象“替换”原始值。所以说“它不完全是工厂方法”是正确的,但它有很大的相似之处。或者简而言之:如果您以这种方式定义静态工厂方法,即必须返回一个 new 实例,那么这不符合定义。
  • 这里没有问题。

标签: java design-patterns factory factory-pattern


【解决方案1】:

工厂方法模式

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

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

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

静态工厂方法

静态工厂方法模式是一种编写干净代码的方法。这是一种给构造函数一个更有意义的名称来表达它的作用的方法。例如

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

上面的代码是什么意思?

newListotherList 的副本还是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);

【讨论】:

    【解决方案2】:

    下面是“设计模式”[Gamma95, p. 中的“工厂方法模式”的定义。 107]' “定义用于创建对象的接口,但让子类决定要实例化哪个类。Factory 方法让类将其使用的实例化推迟到子类。”

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

    请看以下示例:Factory method pattern


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

    见:Is it OK to call abstract method from constructor in Java?

    【讨论】:

      【解决方案3】:

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

      定义。 “定义用于创建对象的接口,但让子类决定实例化哪个类。Factory 方法让类将其使用的实例化推迟到子类。

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-08-04
        • 1970-01-01
        • 2014-02-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多