一个类只允许创建一个对象或实例
实现
饿汉式 在类加载的时候就已经初始化好了
//饿汉式 在类加载的时候就初始化好了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支持不太友好
- 会隐藏类之间的依赖关系
- 扩展性不好
- 可测试性不好
- 不支持有参数的构造函数
