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