带有静态成员的Singleton v/s类&;Java中的方法

带有静态成员的Singleton v/s类&;Java中的方法,java,design-patterns,singleton,Java,Design Patterns,Singleton,可能重复: 为什么一个人只需要一个实例?使用带有静态成员变量和静态方法的类也可以达到同样的目的 据我所知,可能有两种可能的答案: 当您的类需要有状态,而您只需要它的一个对象时。从设计的角度来看,带有静态方法和变量的类被认为是实用类,不应该保持任何状态 如果您的类需要参与多态性,并且您只需要继承树中类的一个对象 如果有人能提供一个来自真实场景或任何Java API的示例,其中单例对象需要参与多态性/继承,这将非常有帮助 执行日志记录或对数据库的公共访问的类通常遵循单例模式。基本上,任何应该有实例

可能重复:

为什么一个人只需要一个实例?使用带有静态成员变量和静态方法的类也可以达到同样的目的

据我所知,可能有两种可能的答案:

  • 当您的类需要有状态,而您只需要它的一个对象时。从设计的角度来看,带有静态方法和变量的类被认为是实用类,不应该保持任何状态

  • 如果您的类需要参与多态性,并且您只需要继承树中类的一个对象


  • 如果有人能提供一个来自真实场景或任何Java API的示例,其中单例对象需要参与多态性/继承,这将非常有帮助

    执行日志记录或对数据库的公共访问的类通常遵循单例模式。基本上,任何应该有实例方法并且构建成本很高的东西

    是无法作为静态类实现的单例的典型示例,因为它的目标显然是成为
    java.util.Set
    接口的实例。创建并不昂贵,但每次需要一个空集时创建一个新实例是愚蠢的,因为唯一的实例可以重复使用。

    我的答案很简短,但只需使用普通的单例就足够了,而不用它的静态实现。答案是:

    • 流行范例(没错!)
    • 线程(同步等)
    • 接口实现(静态类有一些限制)

    范围和行为是不同的关注点,不应混淆。您可能希望对象在每次使用、每次线程、每次web请求、每次会话或全局(单例)时可用。做出这些调整的原因可能是由于资源管理和最终的绩效。如果更改了类的范围,则类内部的行为不必更改


    Singleton是一种模式,用于获取一个常规对象并通过少量附加代码控制其范围。理想情况下,您实际上不应该在对象内部处理范围,而是将其委托给工厂或容器。

    与数据库的连接是最常见的单例之一。你需要一个连接。