什么是单例模式?
SingletonPattern,确保这个类只有一个实例,而且自行实例化并向整个系统提供这个实例。
优点
- 内存中只有一个实例,减少内存开支,减少系统性能的开销(如这个实例对象在生产时需要较多的资源时,如读取配置、禅城其他以来对象等)
- 可以避免对资源的多重占用(如一个写文件动作,一个实例对象这样避免一个资源文件的同时写操作)
- 在系统中设置全局访问点,优化和共享资源访问
缺点
- 单例一般没有接口,扩展困难。(我说的是一般)
- 对测试不利。(某种情况下我觉得也无所谓了)
使用场景
- 要求生成唯一序列号的环境
- 在整个项目中需要一个共享访问点或共享数据。如web页面的访问计数器等
- 创建一个对象需要消耗的资源过多,如还需要访问IO或者数据库等
- 需要定义大量的静态常量和静态方法的环境
注意事项
最主要的就是线程安全不安全的问题。
正确的写法
/**
* Created by jls on 2018/2/26.
*
* 静态内部类
* 我比较倾向于使用静态内部类的方法
*/
public class Singleton5 {
//创建一个静态内部类
private static class SingletonHolder{
private static final Singleton5 singleton= new Singleton5();
}
//私有的构造函数
private Singleton5(){}
private static final Singleton5 getSingleton(){
return SingletonHolder.singleton;
}
}
/**
* Created by jls on 2018/2/26.
* 双重检验锁模式
*
*/
public class Singleton3 {
//创建一个私有的对象 volatile确保 指令重排序优化
private volatile static Singleton3 singleton;
// 构造函数 私有的
private Singleton3(){}
//使用公共方法来获取对象 双重检验锁
public static Singleton3 getSingleton(){
if(singleton==null){
synchronized (Singleton3.class){
if(singleton==null) {
singleton = new Singleton3();
}
}
}
return singleton;
}
}
其他还有懒汉式、双重检验锁模式、饿汉式、静态内部类、枚举类型的方式
详细请看 https://github.com/woboke/helloworld/tree/master/src/main/java/com/edianedi/DesignPatterns/SingletonPattern
没有评论