单例模式是一种常用的软件设计模式,其定义是单例对象的类只能允许一个实例存在。
单例的实现主要是通过以下两个步骤:
- 将该类的构造方法定义为私有方法,这样其他处的代码就无法通过调用该类的构造方法来实例化该类的对象,只有通过该类提供的静态方法来得到该类的唯一实例;
- 在该类内提供一个静态方法,当我们调用这个方法时,如果类持有的引用不为空就返回这个引用,如果类保持的引用为空就创建该类的实例并将实例的引用赋予该类保持的引用。
单例模式的五种实现方式
1.饿汉单例
/**
* @author: sfg
* @create: 2020-12-23 19:40
**/
public class HungrySingleton {
private static HungrySingleton hungrySingleton = new HungrySingleton();
private HungrySingleton(){}
public static HungrySingleton getInstance(){
return hungrySingleton;
}
}
2.懒汉单例
/**
* @author: sfg
* @create: 2020-12-22 20:40
**/
public class LazySingleton {
private LazySingleton(){}
private static LazySingleton LAZY_SINGLETON = null;
public synchronized static LazySingleton getLazySingleton(){
if (LAZY_SINGLETON == null){
LAZY_SINGLETON = new LazySingleton();
}
return LAZY_SINGLETON;
}
}
3.双重检索
/**
* @author: sfg
* @create: 2020-12-23 20:46
**/
public class DoubleCheckSingleton {
private DoubleCheckSingleton(){}
private static DoubleCheckSingleton doubleCheckSingleton;
public static DoubleCheckSingleton getInstance(){
if (doubleCheckSingleton == null){
synchronized (DoubleCheckSingleton.class){
if (doubleCheckSingleton == null){
doubleCheckSingleton = new DoubleCheckSingleton();
}
}
}
return doubleCheckSingleton;
}
}
4.静态内部类单例模式
/**
* @author: sfg
* @create: 2020-12-22 21:03
**/
public class LazyInnerSingleton {
private LazyInnerSingleton() {
}
public static final LazyInnerSingleton getInstance() {
return LazyInner.LAZY_INNER_SINGLETON;
}
private static final class LazyInner {
private static final LazyInnerSingleton LAZY_INNER_SINGLETON = new LazyInnerSingleton();
}
}
5.枚举单例模式
/**
* @author: sfg
* @create: 2020-12-23 20:50
**/
public enum EnumSingleton {
INSTANCE;
//可以省略此方法,EnumSingleton.INSTANCE进行操作
public static EnumSingleton getInstance() {
return EnumSingleton.INSTANCE;
}
}