单例模式
所谓单例,就是整个程序有且仅有一个实例。该类负责创建自己的对象,同时确保只有一个对象被创建。
具有三个特点:
- 类构造器私有
- 持有自己类型的属性
- 对外提供获取实例的静态方法
饿汉式:
public class Singleton {
// //创建 Singleton 的一个对象
private static Singleton singleton = new Singleton();
//让构造函数为 private,这样该类就不会被实例化
private Singleton(){}
//获取唯一可用的对象
public static Singleton getSingleton(){
return singleton;
}
}
每次类加载都会创建一个对象,浪费内存
懒汉式:
public class Singleton {
private static Singleton singleton = null;
private Singleton() {
}
public static Singleton getSingleton() {
if (singleton == null) {
singleton = new Singleton();
}
return singleton;
}
}
使用是创建对象,节省内存但时间较长
静态内部类单例模式
public class Singleton {
private Singleton(){
}
public static Singleton getInstance(){
return Inner.instance;
}
private static class Inner {
private static final Singleton instance = new Singleton();
}
}
只有第一次调用getInstance方法时,虚拟机才加载 Inner 并初始化instance ,只有一个线程可以获得对象的初始化锁,其他线程无法进行初始化,保证对象的唯一性。目前此方式是所有单例模式中最推荐的模式,但具体还是根据项目选择。
参考:https://www.jianshu.com/p/3bfd916f2bb2