单例模式的几种方式

拥有回忆 提交于 2020-02-28 07:30:54

单例模式的几种方式,通用一点来说,分为两种,懒加载和非懒加载

1非懒加载

   

package com.thread.ch1;

/**
 * 不能懒加载
 */
public class SingletonObject1 {
    public static final SingletonObject1 instance = new SingletonObject1();

    private SingletonObject1() {
    }

    public SingletonObject1 getInstance() {
        return instance;
    }
}


2 其他的几个版本都是围绕懒加载来搞的

package com.thread.ch1;

/**
 *双重校验 懒加载
 */
public class SingletonObject5 {
    private static volatile SingletonObject5 instance;

    private SingletonObject5() {
    }

    public  static SingletonObject5 getInstance() {
        if (instance == null) {
            synchronized (SingletonObject5.class){
                if(null == instance)
                instance = new SingletonObject5();
            }
        }
        return instance;
    }
}

//--------静态内部类的方式

package com.thread.ch1;

/**
 * 
 */
public class SingletonObject6 {

    private SingletonObject6() {
    }

    private static class InstanceHold {
        private static final SingletonObject6 instance = new SingletonObject6();
    }

    public static SingletonObject6 getInstance() {

        return InstanceHold.instance;
    }
}

//--------------枚举
package com.thread.ch1;

import sun.dc.pr.PRError;

/**
 * 这种是effective java里最推荐的写法
 */
public class SingletonObject7 {

    private SingletonObject7() {
    }

    private enum Single {
        INSTANCE;
        private final SingletonObject7 instance;

        Single() {
            this.instance = new SingletonObject7();
        }

        public SingletonObject7 getInstance() {
            return instance;
        }
    }

    public static SingletonObject7 getInstance() {

        return Single.INSTANCE.getInstance();
    }
}



 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!