核心作用:
保证一个类只有一个对象,并且提供一个访问该实例的全局访问点。
常见应用场景:
1、windows中的任务管理器就是典型的单例模式
2、windows回收站也是单例模式
3、项目中读取配置文件的类也是单例模式
4、日志管理
。。。
单例模式的优点:
1、由于单例模式只生成一个实例,减少了系统性能开销,当一个对象的产生需要比较多的资源时,如读取配置、产生其它依赖对象时,则可以通过在应用启动时直接产生一个单例对象,然后永久驻留内存的方式来解决
2、单例模式可以设置全局访问点,优化共享资源的访问,例如可以设计一个单例类,负责所有数据表的映射处理
常见的五种单例模式实现方式:
主要:
饿汉式:(线程安全,调用效率高。但是不能延时加载)
懒汉式:(线程不安全,调用效率不高。但是可以延时加载)
其他:
双重检测锁式(由于JVM底层内部模型原因,偶尔会出现问题,不建议使用)
静态内部类式(线程安全、调用效率高。但是可以延时加载)
枚举单例(线程安全、调用效率高。不能延时加载)
饿汉式
package com.pattern.singleton; /** * 测试饿汉单例模式 */ public class SingLetonDemo1 { //类初始化立即加载,所以叫饿汉式 //类初始化时,立即加载这个对象(不能延时加载),加载类时,天然的是线程安全的 private final static SingLetonDemo1 singLetonDemo1 = new SingLetonDemo1(); private SingLetonDemo1() { } //方法没有同步,调用效率高 public static SingLetonDemo1 getInstance() { return singLetonDemo1; } }
懒汉式
package com.pattern.singleton; /** * 测试懒汉单例模式 */ public class SingLetonDemo2 { //类初始化时,不初始化这个对象(延时加载,真正用的时候加载) private static SingLetonDemo2 singLetonDemo2 = null; private SingLetonDemo2() { } //方法同步调用效率低 public static synchronized SingLetonDemo2 getInstance() { if(singLetonDemo2 == null) { singLetonDemo2 = new SingLetonDemo2(); } return singLetonDemo2; } }