java.time.LocalDate 和 java.time.ZonedDateTime 是否应用了工厂模式?



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

但是,特别是在类java.time.LocalDatejava.time.ZonedDateTime中,提到了关键字工厂。可以从以下位置找到关键字工厂

  • https://docs.oracle.com/javase/8/docs/api/java/time/LocalDate.html
  • https://docs.oracle.com/javase/8/docs/api/java/time/ZonedDateTime.html

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

我认为他们想应用规则

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

摘自Joshua Bloch《Effective Java》一书。

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

例如:

ZonedDateTime.now();

更具描述性

new ZonedDateTime();

是,不是吗?

您可能还想阅读: Joshua Bloch #Item 1:考虑静态工厂方法而不是构造函数

我看到这个选择至少有三个原因(是的,这是工厂模式(:

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

例如,它可能会缓存一些实例 - 我认为它目前没有这样做,但这仍然是一种选择。

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

相关内容

最新更新