当我第一次开始看到反单音的评论时,我很困惑。我在最近的一些项目中使用了单例模式,并且效果很好。事实上,我已经使用了很多次。

现在,在遇到一些问题后,阅读了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上的这些帖子:

  • Singletons are pathologic liars(但是,如果您问这个问题,您可能已经理解了)
  • A talk on Dependency Injection
  • Guide to Writing Testable Code

  • 希望有人为C++世界做了一个DI框架/容器? Google似乎发布了C++ Testing FrameworkC++ Mocking Framework,这可能会对您有所帮助。

    关于language-agnostic - 我应该如何重构代码以删除不必要的单例?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/474613/

    10-14 16:03