【问题标题】:Did java.time.LocalDate and java.time.ZonedDateTime apply the factory patternjava.time.LocalDate 和 java.time.ZonedDateTime 是否应用了工厂模式
【发布时间】:2017-08-09 08:47:37
【问题描述】:

在核心 Java 8 的日期和时间库中,即 java.time 包中的那些类中,我发现了一个特殊的共同特征:该包的每个类中都没有公共构造函数,因此所有类只能通过一些static 方法,例如ofnow 等。在这个意义上,java.time 中的类类似于工厂设计模式。然而,这些类与工厂设计模式的不同之处在于工厂设计模式的本质是松散耦合代码以使用通用方法实例化各种类型的对象(通常static),因此返回对象实例的类型直到运行时才确定。

但是,尤其是。在java.time.LocalDatejava.time.ZonedDateTime 类中,提到了关键字factory。可以从以下位置找到关键字 factory

所以我想知道java.time.LocalDatejava.time.ZonedDateTime 是否应用了工厂设计模式?如果不是,他们应用了什么设计模式?

【问题讨论】:

    标签: design-patterns java-8


    【解决方案1】:

    我认为他们想应用规则

    考虑静态工厂方法而不是构造函数

    来自书Effective Java by Joshua Bloch

    该规则的目标是静态方法可以作为构造函数更具描述性,因为方法具有名称。

    例如:

    ZonedDateTime.now();
    

    更具描述性
    new ZonedDateTime();
    

    是吗?

    您可能还想阅读:Joshua Bloch #Item 1: Consider static factory methods instead of constructors

    【讨论】:

    • 非常感谢 :) 这就是我想知道的。所以它是静态工厂方法。正如您提到的《有效 Java》一书所说:静态工厂方法与设计模式 [Gamma95,p. 107]。本项中描述的静态工厂方法在设计模式中没有直接等效
    【解决方案2】:

    我认为这种选择至少有三个原因(是的,这就是工厂模式):

    这样,它可以在将来返回一个专门的LocalDate,例如,它只能在内部扩展(因为没有用户可用的构造函数)。这样,专门的类就不会暴露给客户——只在内部知道。这似乎正是您关于运行时不同类型的观点——目前它们不返回任何特定的子类型,但它们将来可能会返回。

    例如,它可能会缓存一些实例 - 我认为它目前不会这样做,但这仍然是一个选项。

    一些方法具有描述性名称:ofYearDayofInstance 等。

    【讨论】:

    • 非常感谢您的意见 :) 有一点我感到怀疑:LocalDatefinal 类和 不可变,所以似乎没有任何扩展在未来
    猜你喜欢
    • 1970-01-01
    • 2011-11-02
    • 2011-12-16
    • 1970-01-01
    • 2010-09-28
    • 1970-01-01
    • 2021-08-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多