代码之家  ›  专栏  ›  技术社区  ›  anand

在一个项目中有很多单例类是好的编程吗?

  •  3
  • anand  · 技术社区  · 16 年前

    我在一个项目中有几个类应该只创建一次。

    最好的方法是什么?,

    1. 它们可以创建为静态对象。
    2. 可以创建为singleton
    3. 可以创建为全局。

    实现这一点的最佳设计模式是什么?

    我正在考虑将所有类都创建为singleton,但这会创建很多singleton。有很多单例是好的编程实践吗?

    使用单件有什么利弊?

    9 回复  |  直到 10 年前
        1
  •  16
  •   David Hodgson    16 年前

    看看Steve Yegge的博客- Singleton Considered Stupid

        2
  •  6
  •   GManNickG    16 年前

    如果它们只需要创建一次,那就不要求它们是单件的。

    • 如果x是单例的,则意味着有一个实例。
    • 如果x有一个实例,这并不意味着它应该是单例的。

    如果你是单身 要求 类只有一个实例,并且它是全局可访问的。在你的情况下,仅仅需要一个是不够的。全球是不好的,单身是光荣的全球。

    大多数时候,你不需要它们。你会在糟糕的代码中看到很多,这是因为我的心态:我只需要一个,那就意味着我应该成为单身汉!( 错误的 )例如,我已经完成了迄今为止最强大的游戏引擎的技术设计。它有两个单例,用于内存和线程。一个非常大的项目,我只有两个!

    更多的上下文将帮助我们为您提供更好的信息。

        3
  •  5
  •   Mike Weller    16 年前

    我建议你看看谷歌的Mi_ko Hevery所做的一些视频和文章。第一个视频: "Clean Code Talks: Global State and Singletons" his blog .

    一般的观点是,在一些罕见的情况下(例如日志记录),单例是可以的,但在大多数其他情况下,您希望使用依赖注入。单例使测试代码变得更加困难,并且它们隐藏了依赖项,因此您的类不能单独容易地实例化。

        4
  •  4
  •   Kaleb Brasee    16 年前

    单子有一些问题——它们很难测试,很难替换,也很难扩展。通常有更好的方法。

        5
  •  3
  •   Greg Hewgill    16 年前

    我最喜欢的关于单身的文章之一是 Singletons are Pathological Liars 作者:Mi_ko Hevery。本质上,他们鼓励“隐藏”的行为,这是非常难以学习和测试的。

        6
  •  1
  •   ima    16 年前

    有些项目实际上无法避免使用globals。所有类型的服务定位器或依赖注入框架仍然依赖对象的全局(不总是静态变量,但总是某种类型的全局)存储。

    然而,单件是一个问题的迹象:

    • 首先,作为规范模式的singleton与接口和抽象不匹配。它可以通过工厂访问来修复。
    • 更糟糕的是,单例是不灵活的——它们没有任何方法来识别超出其类型的对象。(嗯,在C++中,他们通过模板,但这是另一个故事)。从这个意义上说,它们实际上比静态变量更糟。从长远来看,使用一个可以访问同一类型的许多实例的框架是值得的。
    • 最重要的是,很多单子意味着物体之间有很多遥远的关系。这意味着您的系统可能比需要的要复杂,并且开发、测试和管理起来要困难得多。简单地切换到定位器或DI并没有帮助,这是基础设计原则的问题。
        7
  •  1
  •   rayhem    10 年前

    单件有效地说是全球状态。如果你要创造大量的单件物品,你就要创造大量的全球状态,只有在不一定看起来像全球状态。

    这使得很难做诸如构建单元测试、提供模拟类和重用代码之类的事情,因为它非常容易 将当前状态与函数耦合。即函数 foo 仅在以下情况下有效 class X 是在 state Z ,否则不起作用。

    正确地构建线程安全的单例也是有问题的。

    单件可以很好地协调对资源的访问,特别是对于状态不太好、构建成本很高的资源。

    你为什么认为你需要 太多了 单身汉?如果你问你的问题域和你遇到的问题,你可能会得到更好的回答。

        8
  •  0
  •   leepowers    16 年前

    在编程中,没有白银弹。使每个类都成为一个单独的类并不会神奇地使您的代码“更好”。单件是一个工具,解决了一个具体的问题,我研究了更多关于单件。

        9
  •  0
  •   Community Mohan Dere    9 年前

    在项目中使用单例模式应该是一个经过深思熟虑和仔细设计的决定,因为它是一个单向跟踪,很少有回溯的空间。实际上,我在我的一个项目中,在多线程环境中使用它作为商业产品,并面临许多问题。但这并不意味着这是一个不可触及的模式。关键是,任何可以用单例实现的东西都可以不用它实现,而且麻烦和复杂性也更少。有关更多信息,您可以跟踪 this question 几个月前我问过。它有有趣的链接和对单例模式的洞察