创建者模式 —— 单例设计

单例设计模式

结构

实现

饿汉式需要加 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 类

经验分享 程序员 微信小程序 职场和发展