在核心Java 8的日期和时间库中,即包java.time
中的那些类,我发现了一个特殊的共同特征:这个包的每个类中都没有公共构造函数,因此所有类只能通过一些static
方法实例化,如of
、now
等。从这个意义上说,java.time
内部的类类似于工厂设计模式。但是,这些类确实与工厂设计模式不同,因为工厂设计模式的本质是松散耦合代码以使用通用方法(通常static
(实例化各种类型的对象,因此返回的对象实例的类型直到运行时确定。
但是,特别是在类java.time.LocalDate
和java.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.LocalDate
和java.time.ZonedDateTime
是否应用了工厂设计模式?如果不是,他们应用了什么设计模式?
我认为他们想应用规则
考虑静态工厂方法而不是构造函数
摘自Joshua Bloch的《Effective Java》一书。
该规则的目标是静态方法作为构造函数更具描述性,因为方法具有名称。
例如:
ZonedDateTime.now();
更具描述性
new ZonedDateTime();
是,不是吗?
您可能还想阅读: Joshua Bloch #Item 1:考虑静态工厂方法而不是构造函数
我看到这个选择至少有三个原因(是的,这是工厂模式(:
这样,它将来可以返回一个专门的LocalDate
,例如,它只能在内部扩展(因为没有用户可用的构造函数(。这样,专用类就不会暴露给客户端 - 仅在内部知道。这似乎正是您在运行时关于不同类型的观点 -目前它们不返回任何特定的子类型,但将来可能会返回。
例如,它可能会缓存一些实例 - 我认为它目前没有这样做,但这仍然是一种选择。
一些方法有描述性名称:ofYearDay
、ofInstance
等。