单例模式和静态类的区别

https://www.cnblogs.com/windpoplar/p/12944952.html

1>什么时候使用静态类代替singleton :

这里有几个很好的静态类比singleton更好的应用场景. 最基本的例子就是在Java中的java.lang.Math类的实现方式, Math类就是用过静态方法来实现的,而不是单例来实现的.

总结 :

如果你的singleton不提维持任何状态, 仅仅是提供全局的访问 , 这个时候就适合用静态类 , 这样速度也更快, 因为static bind在编译期间(compile during) . 记住不经意维持子类的状态 , 尤其是在并发的情况下, 多个线程并发修改,这容易导致不容易发现的race condition 关于race condition .

静态类适用于一些工具类 , 其他的如单个访问资源就可以用singleton.

2>静态类和singleton之间的区别 :

① static类有更好的访问效率(Static class provides better performance than Singleton pattern, because static methods are bonded on compile time)

③ singleton比static class更容易测试. 那个容易模拟(mock), 哪个就容易测试. singleton很容易用JUnit测试, 因为你能够传递mock对象, 当singleton需要的时候(作为方法参数或者构造函数参数),

④ 如果你的需求是维护(maintain)状态, 那么singleton比static class更好 , 如果使用static class会出现一些问题.

⑤ singleton支持延迟加载 , 而static class 则不支持这样的特性 , 在重量级的对象, 延迟加载就显得非常重要.

⑥ 在一些依赖注入(Dependency injection framework)的框架 , 它能够很好的管理singleton对象 . 例如Spring.

3>singleton相对于静态类的一些高级特点 :

singleton 对于static class 主要的优点是更加面向对象 . 对于singleton你可以使用继承(Inheritance)和多态(polymorphism)来继承一个基类, 实现一个接口, 提供不同功能 的实现. 例如 , Java中java.lang.Runtime ,该类就是一个singleton的, 调用getRuntime(),基于不同的JVM ,返回不同的实现对象, 针对一个一个JVM,确保只有一个Runtime对象 , 如果使用static class就不能很好的来实现这样的功能了 .

https://blog.csdn.net/weixin_42957931/article/details/106840172

1,应用场景
概况:当需要资源共享且需要控制资源的时候
1)有频繁实例化然后销毁的情况,也就是频繁的new对象的时候,可以考虑单例模式。
举例一:
统计上机在线人数,也就是全局计算器,所有用户在相同时刻获取到的在线人数是一致的。这里就需要一个全局的唯一访问点,所以计数器就要唯一。

2)创建对象时,消耗的时间和资源过多,但又经常用到的对象
举例二:配置文件访问类,项目中需要一些环境相关的配置文件。如果不用单例,每次调用都要new对象,每次都要重新读一遍配置文件,很影响性能。如果用单例,则只需要读取一遍就可以了。

三、单例与static的区别
1,static在类加载时执行一次,其生命周期是跪着类方法的执行而结束,其不需要再new对象,因为在类加载时就new对象了。所以static有更好的性能。

2,工具类适用于static,因为有更好的访问效率(和状态有关的用单例模式,如游戏中全局的一些状态和变量)

3,单例模式更加面向对象,可使用继承或多态来继承一个基类,实现一个借口,不同的功能。

推荐阅读更多精彩内容