我在一个项目中有几个类应该只创建一次。
最好的方法是什么?
- 它们可以被创建为静态对象。
- 可以被创建为单例模式。
- 可以被创建为全局对象。
最佳设计模式是什么?
我考虑将所有类都创建为单例模式,但这会创建大量单例。拥有大量单例是良好的编程实践吗?
使用单例模式的利弊是什么?
请查看Steve Yegge的关于此问题的博客文章 - 单例被认为是愚蠢的
单例模式存在几个问题——难以测试、难以替换和难以扩展。通常有更好的方法。
我最喜欢的有关单例模式的文章之一是Miško Hevery的"Singletons are Pathological Liars"。基本上,它们鼓励“隐藏的”行为,这很难被学习和测试。
单例模式实际上是全局状态。如果你要创建很多单例,你就会创建很多全局状态,只是它看起来不像全局状态。
这使得构建单元测试、提供模拟类和重用代码变得困难,因为很容易将当前状态与函数耦合在一起。例如,当class X
处于state Z
时,函数foo
才有效,否则它就无法工作。
正确地构建线程安全的单例也是有问题的。
单例可以用于协调对资源的访问,特别是那些没有太多状态且构造成本高昂的资源。
那么,为什么你认为你需要很多单例?如果你询问你的问题域和遇到的问题,你可能会得到更好的回答。
有些项目中,你无法避免使用全局变量。所有种类的服务定位器或依赖注入框架仍然依赖于对象的全局存储(不一定是静态变量,但始终是某种全局存储)。
但是,单例模式是问题的标志:
在项目中使用单例模式应该是一个经过深思熟虑和谨慎设计的决定,因为它是一条单向道,很少有回头的余地。我曾在一个多线程环境下的商业产品中实际使用过它,并面临了许多问题。但这并不意味着它是一个不可触及的模式。关键是任何可以通过单例实现的东西都可以在没有它的情况下实现,而且更少的麻烦和复杂性。如果想了解更多信息,请查看我几个月前提出的this question。它包含有关单例模式的有趣链接和见解。
struct uhoh { uhoh(){static bool firstTime = true; if (!firstTime) make_computer_splode(); firstTime = false; } };
:) - GManNickG