核心作用:
保证一个类只有一个对象,并且提供一个访问该实例的全局访问点。
常见应用场景:
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;
}
}