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