一个类只允许创建一个对象或实例
实现
饿汉式 在类加载的时候就已经初始化好了
//饿汉式 在类加载的时候就初始化好了
public class Singleton01 {
private static final Singleton01 instance = new Singleton01();
private Singleton01() {}
public static Singleton01 getInstance() {
return instance;
}
}
懒汉式 支持延时加载,在需要的时候在加载
//懒汉式 在需要的时候加载
public class Singleton02 {
private static Singleton02 instance;
private Singleton02() {}
public static synchronized Singleton02 getInstance() {
if (instance == null) {
return new Singleton02();
}
return instance;
}
}
双重检查 懒汉式的并发度是比较低的,因此出现了双重检查的模式
//双重检查
public class Singleton3 {
private volatile static Singleton3 instance;
private Singleton3(){}
public static Singleton3 getInstance() {
if (instance == null) {
synchronized(Singleton3.class) {
if (instance == null) {
instance = new Singleton3();
}
}
}
return instance;
}
}
静态内部类 静态内部类在外部类被加载的时候并不会加载,只有调用getInstance()方法的时候才会加载进来
public class Singleton04 {
private Singleton04() {}
private static class SingletonHandler{
private static Singleton04 instance = new Singleton04();
}
public static Singleton04 getInstance() {
return SingletonHandler.instance;
}
}
枚举
public enum Singleton05 {
INSTANCE;
public void test(){
System.out.println("test....");
}
}
单例模式存在的问题
- 对OOP支持不太友好
- 会隐藏类之间的依赖关系
- 扩展性不好
- 可测试性不好
- 不支持有参数的构造函数