单例模式绝对是最被滥用和误用的设计模式之一。我们中的许多人在某个时候都感染了单例模式恶病。奇怪的是,它的近亲Monostate却不那么出名,也不那么常用。你对Monostate有什么看法?它是好还是邪恶的东西?它是否是使用单例模式的更好选择?您是否也会像对待单例模式一样反对使用它?
单例模式绝对是最被滥用和误用的设计模式之一。我们中的许多人在某个时候都感染了单例模式恶病。奇怪的是,它的近亲Monostate却不那么出名,也不那么常用。你对Monostate有什么看法?它是好还是邪恶的东西?它是否是使用单例模式的更好选择?您是否也会像对待单例模式一样反对使用它?
嗯,单态就是单例…所以它面临着完全相同的问题。
单例和单态的一个方面与全局变量相似,即它们是共享的,因此不是线程安全的。虽然如果您计划创建多线程应用程序,这是一个问题,但如果您知道这一点,可以采取措施来序列化访问共享对象。因此,这可能是唯一一个领域,通常可以认为所有三种类型都会引起问题。
仅仅因为使用模式而使用它们如何?
更新:滥用单例的原因是人们没有充分理由就添加了这种模式。它通常会增加任意的限制,却没有任何好处。如果不使用模式也可以创建唯一实例而不会导致世界崩溃,那么就不要强制使用模式。
你为什么假设人们会反对使用单例模式?对单例模式进行笼统的概括就像对goto语句、全局变量等进行笼统的概括一样。它们都有各自的用途,没有一种是“邪恶”的,它们被误用并不意味着不能使用,只是需要正确使用。
如何创建一个只有单个实例但没有全局访问权限的类:
public class SingleInstance
{
private static boolean exhausted = false;
public SingleInstance()
{
if (exhausted)
{
throw new IllegalStateException("only one instance allowed");
}
exhausted = true;
[...]
}
[...]
}
这样做避免了 Singleton 和 MonoState 的问题,同时强制并清晰地传达只有一个实例。
Monostate的优点在于,你不需要了解对象的实现细节就可以使用它。换句话说,你可以省略一些按照单例模式调用getInstance方法的步骤(Singleton s = Singleton::getInstance; s.Method();),而是直接使用普通的语言结构(Monostate ms; ms.Method();)。这是一个微妙的区别。
每种编程语言结构都可能被贴上“邪恶”的标签,因为每种编程语言结构都可能被滥用。
当合理使用时,我认为两者都不是“邪恶”或“好的”。