Monostate是邪恶的单身人士的堂兄吗?

Boo*_*oon 7 oop design-patterns

Singleton绝对是最滥用和滥用的模式之一.我们中的许多人已经在某一时刻感染过单一炎症.奇怪的是,它的近亲Monostate不那么有名,而且使用率较低.您对Monostate有何看法?善还是恶?它是使用Singleton的更好选择吗?您是否也会像使用Singleton一样阻止它的使用?

小智 7

嗯,monostate Singleton ...所以它有完全相同的问题.

  • 测试
  • 隐藏依赖关系
  • 呆板
  • 线程安全
  • 全球状态使得难以确保正确性

  • Monostate与单身人士不同,或者我不会提出这个问题.https://segueuserfiles.middlebury.edu/xp/SingletonAndMonostate.pdf (3认同)

Dus*_*etz 5

如何不使用模式只是因为?

更新:滥用单身人员是因为人们添加了没有理由的模式.它经常增加任意约束,没有任何好处.使用monostate w/o理由可能不那么有害,但没有理由.如果宇宙不会崩溃,如果有多个实例,则不要使用模式强制执行 - 只需创建一个实例.


ckr*_*mer 5

我对 Monostate 的最大问题是它会导致使用它的人感到困惑。一般来说,如果您创建一个对象的新实例,您希望它就是一个新实例,具有自己的状态和生命周期。我通常认为意外行为是一件坏事,所以我更喜欢单例,因为你知道当你使用它时会得到什么。

至于这两种模式是否邪恶,单例往往会被滥用,但所有其他模式、switch 语句、for 循环或其他任何你想提到的东西也是如此。


Eri*_*sch 5

根据Monostates的这个定义,这是注意:

"Monostates就像SingletonsAreEvil一样邪恶."

我不一定同意.基本前提是Singletons和Monostates是全局变量,因为Globals是邪恶的,所以Singletons和Monostates也必须如此.

这种推理的问题在于它没有考虑为什么全局变量是邪恶的.全局变量是邪恶的,主要是因为它们是可以在本地范围之外意外访问的变量,类似于非类型语言通常只允许通过引用变量来创建变量.

Singletons和Monostates不会导致同样的问题,因为它几乎不可能"意外地"引用全局静态,调用它的实例方法,然后使用实例.

换句话说,全局变量是邪恶的,因为它们会导致细微而难以察觉的问题.单身人士和单身人士不会造成同样的问题,所以我不会因为同样的原因而认为他们是邪恶的,这是大多数人在这个论点中似乎出错的地方.

现在,单身人士和单身人士会引起其他类型的问题吗?当然.显然,TDD人讨厌他们,因为他们很难通过自动化测试正确测试.好的,很好,但对于那些不使用TDD的人来说,这些问题并不存在.

当然,单身人士可能会被滥用.仅仅为了避免传递实例而使用它们的人滥用它们.我认为Monostates比单身人士更好.

许多人提出工厂模式而不是单身人士,但我觉得工厂只是花哨的单身生成器.不,没有静态"实例"方法,但它基本上做同样的事情(当工厂创建单个实例对象时).Factory.Create与Singleton.Instance没有什么不同.

编辑:

与Globals相比,Singletons和Monostates的一个方面是它们是共享的,因此不是线程安全的.如果您计划执行多线程应用程序,这是一个问题,如果您知道这一点,您可以采取步骤序列化对共享对象的访问.因此,这可能是唯一一个通常会将所有三种类型都视为引起麻烦的区域.