Design patterns 是否存在单身人士是最佳选择的情况?

Design patterns 是否存在单身人士是最佳选择的情况?,design-patterns,oop,singleton,Design Patterns,Oop,Singleton,这个网站上有很多关于为什么应该避免单身的讨论,但是有没有任何情况下单身是有意义的并且是最好的选择 我认为单例是最好的选择的一个例子是,在实现映射时,您需要跟踪已从映射层中的数据库加载的所有模型。在这种情况下,映射必须是有效的全局映射,以便所有客户机代码使用相同的映射实例,并且它们都访问相同的加载模型列表。最简单的解决方案似乎是将类实现为单例(或静态方法)。这是最好的方法还是有其他方法 在其他情况下,是否可以使用单例,或者它们总是不好的?在不允许静态接口成员的语言中,例如在.NET中,也可以使用单

这个网站上有很多关于为什么应该避免单身的讨论,但是有没有任何情况下单身是有意义的并且是最好的选择

我认为单例是最好的选择的一个例子是,在实现映射时,您需要跟踪已从映射层中的数据库加载的所有模型。在这种情况下,映射必须是有效的全局映射,以便所有客户机代码使用相同的映射实例,并且它们都访问相同的加载模型列表。最简单的解决方案似乎是将类实现为单例(或静态方法)。这是最好的方法还是有其他方法


在其他情况下,是否可以使用单例,或者它们总是不好的?

在不允许静态接口成员的语言中,例如在.NET中,也可以使用单例(以及类似的语言)。通过提供单例,您就有了一个实例,可以将接口作为实例提供。因此,在.NET中,示例可能是:

  • Comparer.Default
    -为排序
    T
  • EqualityComparer.Default
    -为哈希/相等测试
    T
这是一种达到目的的手段;这不是我们想要做的,只是一个合理的“怎么做”


就“身份映射”示例而言,我个人更愿意将其保留在一个实例上,并使该实例可供我的所有代码使用。除此之外,如果您可以放弃测试之间的映射,或者(稍后)可以灵活地同时拥有多个标识映射,那么它还有助于可测试性。

请考虑将应用程序中的不同事件记录到单个文件的情况。在这种情况下,单例类日志将非常有用。因为应用程序的不同部分将访问日志类的相同实例。

请参阅。

单例确实有其用途。他们也有自己的弊端,有很多理由不喜欢他们,或者为什么他们让测试变得困难

这里有一个单例模式的小辩护

有时,一个程序需要表示或与真正独特的东西交互。例如,物理资源。例如,您不能有多个“stdout”。以及操作系统进程的表示(例如J2ME的Midlet)


在使用类/接口进行封装时,单例是值得的,否则它将是一个裸全局变量。当您使用web编程时,单例是有意义的:通常每个请求只需要一个页面输出类实例,以及一个用户对象。不过,数据库是不同的——实现特权分离是需要多个db对象的一个很好的理由。

我个人的指导原则是,如果可以在之后实例化一个类的一个对象,就永远不要将一个类硬编码为单例。这使得单例非常罕见,而且在应用程序代码中常常是不必要的。当使用像Spring这样的DI框架时尤其如此


在框架中,单例确实可以用作“入口点”,但规则是将它们用作“根单例”(在依赖层次结构的开头),并让其余代码尽可能少地依赖于该单例。

单例确实有其用途。我将其用途总结如下:

“应使用单例来表示对象,根据基本设计或要求,该对象最多可以有一个实例;并且与该对象相关的数据或资源会产生可测量的成本。”以下是我的意思

1) 你不应该在有很多东西的情况下使用单例,但我们只对其中一个感兴趣。如果系统中可能有两个,那么显式地实例化一个

2) 一个包含所有静态方法和数据的类可以代替一个单例的许多用法。如果你能做到这一点而不受性能的影响,那就去做吧


3)如果设置对象有一个明显的成本,例如,如果它是需要初始化的物理资源,或者依赖于需要初始化的一些查找表,则应该考虑单点。如果是这种情况,对于单例,您可以将初始化成本推迟到首次使用对象,而静态类通常会在应用程序启动时进行初始化。如果从未使用过该对象,则不会支付初始化成本。

当您只需要一个实例,并且希望通过设计强制执行该实例时,应使用单实例。不应使用它,因为它会引起全球副作用

在您的例子中,我认为这是有意义的,因为您只想限制类的一个实例