这里简单的写下两种自己喜欢的单例模式。
1.枚举单例模式:
它是JDK 5 后引进的枚举单例模式,代码非常简洁(最大特点),简直是程序员的福利,不仅简单,而且它默认枚举实例的创建是线程安全的,但是在枚举中的其他任何方法中就需要自己编码实现了。
/**
* 枚举单例模式
* @author Troy Zhong
* @create 2019-01-16 15:59
*/
public enum EnumSingleton {
//实例
instance;
}
通过类名来调用,即EnumSingleton.instance,简洁清晰。
2.延迟初始化占位(Holder)类模式:
它引入了一个内部静态类(static class),内部静态类只有在调用时才会加载,它保证了Singleton 实例的延迟初始化,又保证了实例的唯一性。是一种提前初始化和延迟初始化的综合模式,也就是饿汉式和饱汉式的结合体。它把singleton 的实例化操作放到一个静态内部类中,在第一次调用getInstance() 方法时,JVM才会去加载InstanceHolder 类,同时初始化singleton 实例,所以能让getInstance() 方法线程安全。 特点是:即能延迟加载,也能保证线程安全。
/**
* @author Troy Zhong
* @create 2019-01-16 16:10
*/
public class Singleton {
//私有构造器
private Singleton(){}
//内部静态类
private static class InstanceHolder{
private InstanceHolder(){}
private static final Singleton singleton = new Singleton();
}
//公有实例化方法
public static Singleton getInstance(){
return InstanceHolder.singleton;
}
}
当然还有很多其他方式可以实现单例,这里不过多介绍。
如有错误或者不足,请大神们指教,感谢!