之前我曾经使用过C#,我考虑过
Calendar cal = Calendar.getInstance();
根据GoF 单例模式(维基百科)的定义,要创建两个日历,因为
Date
有点过时,需要成为单例方法。从文档中可以得到:
还有其他重载方法。使用默认时区和语言环境获取日历。
getInstance(TimeZone zone)
getInstance(Locale aLocale)
这似乎是将单例模式推广到每个时区和语言环境来创建单例的一般化。但我想在同一个时区中拥有两个日历。
然而,当我进行测试时。
@Test
public void test()
{
Calendar cal = Calendar.getInstance();
Calendar cal2 = Calendar.getInstance();
assertTrue(cal == cal2);
}
它失败了,告诉我这个
getInstance()
方法实际上不是单例模式的 getInstance()
方法,而是其他东西。那么,一般情况下,getInstance()
是否符合 Java 中的单例模式?如果是,Java 文档中有哪些关键词可以找到它是否是单例模式?如果不是,我该如何在 Java 中识别单例模式?或者只有 Calendar
是例外吗?我不想每次遇到 getInstance()
调用时都要实现一个单元测试。我已经阅读了 this answer to "What is an efficient way to implement a singleton pattern in Java?",它将像 C# 一样工作,这与 Calendar
的实现相矛盾。
getInstance
是一个工厂方法,它可能返回一个单例。没有关键字可以告诉我们返回的对象是否将成为单例。 - Shailesh AswalgetInstance()
可以表示获取一个实例(工厂模式)或获取唯一实例(单例模式)。其他模式中也有类似visit()
、create()
和notify()
等方法,但不能假设使用这些方法就意味着应用了访问者模式、工厂方法或观察者模式。设计模式不仅仅是一个方法名。 - Fuhrmanator