单例模式的三种写法

DCL

public class T{
    private volatile static T t = null;
    private T(){}
    static{
        if(t == null){
            synchronized (T.class) {
                if(t == null){
                    t = new T();
                }
            }
        }
    }
    public static T getInstance(){
        return t;
    }
}

静态内部类

public class T{
    private T(){}
    private static class Singleton{
        private static final Singleton instance = new Singleton();
    }
    public static Singleton getInstance(){
        return Singleton.instance;
    }
}

枚举

public class T{
    public static void main(String[] args) {
        TTT.getInstance().print();
        TTT.getInstance().print();
    }
}

class TTT{
    public enum Singleton{
        instance;
        private Singleton(){
            System.out.println("我是单例下的一个构造方法,只执行一次");
        }
        public void print(){
            System.out.println("我是单例下的一个方法");
        }
    }
    public static Singleton getInstance(){
        return Singleton.instance;
    }   
}

输出结果:
我是单例下的一个构造方法,只执行一次
我是单例下的一个方法
我是单例下的一个方法

  • 值得注意是的:这里一般不将枚举直接暴露在外面,使用Singleton.instance.“()来调用单例下的方法。
    比如如下写法就不合适,它违反了”职责单一原则”,他可以通过Singleton.instance.**直接调用。。。
  •     public enum Singleton{
            instance;
            private Singleton(){
                System.out.println("我是单例下的一个构造方法,只执行一次");
            }
            public void print(){
                System.out.println("我是单例下的一个方法");
            }
            public static Singleton getInstance(){
                return instance;
            }
        }

    猜你喜欢

    转载自blog.csdn.net/qq_25956141/article/details/81189338