当我第一次看到反单身评论时,我很困惑.我在最近的一些项目中使用了单例模式,并且它运行得很漂亮.事实上,我已经使用了很多次.
现在,在遇到一些问题之后,阅读这个问题,尤其是这篇博文,我理解了我带给世界的邪恶.
那么:我如何从现有代码中删除单例?
例如:
在零售店管理程序中,我使用了MVC模式.我的Model对象描述了商店,用户界面是View,我有一组控制器,它们充当两者之间的联络.大.除了我将Store变成一个单独的(因为应用程序一次只管理一个商店),我还把我的大部分Controller类变成了单例(一个mainWindow,一个menuBar,一个productEditor ......).现在,我的大多数Controller类都可以像这样访问其他单例:
Store managedStore = Store::getInstance(); managedStore.doSomething(); managedStore.doSomethingElse(); //etc.
我应该改为:
创建每个对象的一个实例,并将引用传递给需要访问它们的每个对象?
使用全局?
别的什么?
Globals仍然很糟糕,但至少他们不会假装.
我看到#1迅速导致可怕的膨胀构造函数调用:
someVar = SomeControllerClass(managedStore, menuBar, editor, sasquatch, ...)
还有其他人经历过这个吗?如果不是全局变量或单个变量,那么为多个单独的类访问公共变量的OO方法是什么?
依赖注入是你的朋友.
在优秀的Google测试博客上查看这些帖子:
单身人士是病态的骗子(但如果你问这个问题,你可能已经理解了这一点)
关于依赖注入的讨论
编写可测试代码的指南
希望有人为C++世界制作了一个DI框架/容器?看起来谷歌发布了一个C++测试框架和一个C++模拟框架,可能会帮助你.