欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

单例模式的三种写法

程序员文章站 2022-07-13 23:34:22
...

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;
            }
        }