当我第一次开始看到反单例的评论时,我很困惑。我在最近的一些项目中使用了单例模式,并且效果很好。这么多,事实上,我已经用过很多次了。
现在,在遇到一些问题后,阅读 this SO问题,尤其是this博客文章,我了解我给这个世界带来的邪恶。
那么:如何从现有代码中删除单例?
例如:
在零售店管理程序中,我使用了 MVC 模式。我的模型对象描述了商店,用户界面是 View ,我有一组 Controller 作为两者之间的联系。伟大的。除了我把 Store 变成了一个单例(因为应用程序一次只管理一个商店),我还把我的大部分 Controller 类变成了单例(一个 mainWindow、一个 menuBar、一个 productEditor...)。现在,我的大部分 Controller 类都可以像这样访问其他单例:
Store managedStore = Store::getInstance();
managedStore.doSomething();
managedStore.doSomethingElse();
//etc.
我应该改为:
全局变量仍然很糟糕,但至少它们不会是 pretending .
我看到#1 很快导致了可怕的构造函数调用:
someVar = SomeControllerClass(managedStore, menuBar, editor, sasquatch, ...)
还有其他人经历过吗?让许多单独的类访问公共(public)变量而不是全局或单例的 OO 方法是什么?
最佳答案
Dependency Injection是你的 friend 。
查看 excellent Google Testing Blog 上的这些帖子:
希望有人为 C++ 世界制作了一个 DI 框架/容器?看起来谷歌已经发布了 C++ Testing Framework和 C++ Mocking Framework ,这可能会帮助你。
关于language-agnostic - 我应该如何重构我的代码以删除不必要的单例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/474613/