创建者模式 —— 单例设计
单例设计模式
结构
实现
饿汉式需要加 final 关键字吗?
声明final的变量,必须在类加载完成时已经赋值,如果你是final非static成员,必须在构造器、代码块、或者直接定义赋值;如果是fainal static 成员变量,必须直接赋值或者在静态代码块中赋值。 在单例模式中,如果存在释放资源的情况下,就不能加final修饰了。
public void releaseInstance(){ if(instance != null){ instance = null; } }
释放资源之后,如果需要重新使用这个单例,就必须存在重新初始化的过程,所以不能加final,对于不需要释放资源的情况,可以加final 总而言之,要不要加final修饰,可以根据情况而定
DCL 加 volatile
public class Singleton { private volatile static Singleton instance; private Singleton() { } public static Singleton getInstance() { if (instance == null) { synchronized (Singleton.class) { if (instance == null) { instance = new Singleton(); } } } return instance; } }
静态内部类
public class Singleton { private Singleton() { } private static class SingletonHolder { private static final Singleton INSTANCE = new Singleton(); } public static Singleton getInstance() { return SingletonHolder.INSTANCE; } }
枚举方式
public enum Singleton { INSTANCE; }
序列化、反序列化破坏单例
JDK 源码解析 —— Runtime 类
下一篇:
搬水果 (贪心算法实现)