Singleton绝对是最滥用和滥用的模式之一.我们中的许多人已经在某一时刻感染过单一炎症.奇怪的是,它的近亲Monostate不那么有名,而且使用率较低.您对Monostate有何看法?善还是恶?它是使用Singleton的更好选择吗?您是否也会像使用Singleton一样阻止它的使用?
嗯,monostate 是 Singleton ...所以它有完全相同的问题.
测试
隐藏依赖关系
呆板
线程安全
全球状态使得难以确保正确性
如何不使用模式只是因为?
更新:滥用单身人员是因为人们添加了没有理由的模式.它经常增加任意约束,没有任何好处.使用monostate w/o理由可能不那么有害,但没有理由.如果宇宙不会崩溃,如果有多个实例,则不要使用模式强制执行 - 只需创建一个实例.
根据Monostates的这个定义,这是注意:
"Monostates就像SingletonsAreEvil一样邪恶."
我不一定同意.基本前提是Singletons和Monostates是全局变量,因为Globals是邪恶的,所以Singletons和Monostates也必须如此.
这种推理的问题在于它没有考虑为什么全局变量是邪恶的.全局变量是邪恶的,主要是因为它们是可以在本地范围之外意外访问的变量,类似于非类型语言通常只允许通过引用变量来创建变量.
Singletons和Monostates不会导致同样的问题,因为它几乎不可能"意外地"引用全局静态,调用它的实例方法,然后使用实例.
换句话说,全局变量是邪恶的,因为它们会导致细微而难以察觉的问题.单身人士和单身人士不会造成同样的问题,所以我不会因为同样的原因而认为他们是邪恶的,这是大多数人在这个论点中似乎出错的地方.
现在,单身人士和单身人士会引起其他类型的问题吗?当然.显然,TDD人讨厌他们,因为他们很难通过自动化测试正确测试.好的,很好,但对于那些不使用TDD的人来说,这些问题并不存在.
当然,单身人士可能会被滥用.仅仅为了避免传递实例而使用它们的人滥用它们.我认为Monostates比单身人士更好.
许多人提出工厂模式而不是单身人士,但我觉得工厂只是花哨的单身生成器.不,没有静态"实例"方法,但它基本上做同样的事情(当工厂创建单个实例对象时).Factory.Create与Singleton.Instance没有什么不同.
编辑:
与Globals相比,Singletons和Monostates的一个方面是它们是共享的,因此不是线程安全的.如果您计划执行多线程应用程序,这是一个问题,如果您知道这一点,您可以采取步骤序列化对共享对象的访问.因此,这可能是唯一一个通常会将所有三种类型都视为引起麻烦的区域.