Java设计模式之单例模式-Singleton


单例:顾名思义就是只有一个实例对象。

懒汉式(延时加载,只有用的时候才进行实例化对象,线程不安全)

public class OKHttpManager {
//懒汉式代码:线程不安全的
    //注意1.外界不能造对象,无参构造方法必须私有
    private OKHttpManager() {
    }
    //注意2.在类中创建一个本类对象,可以加final
    private static OKHttpManager okHttpManager = null;

    //注意3.提供一个公共的getInstance()方法(方法名可以任意取)
    // 通过OKHttpManager.getInstance()获取到该对象
    public static OKHttpManager getInstance() {
        if (okHttpManager == null) {
            okHttpManager = new OKHttpManager();
        }
        return okHttpManager;
    }
}

饿汉式 (初始化直接加载,对于频繁使用的对象建议对这个,线程安全,效率低)

public class OKHttpManager {
//饿汉式代码
    //注意1.外界不能造对象,无参构造方法必须私有
    private OKHttpManager() {
    }
    //注意2.在类中直接创建一个本类对象,可以加final
    private static OKHttpManager okHttpManager = new OKHttpManager();

    //注意3.提供一个公共的getInstance()方法(方法名可以任意取)
    // 通过OKHttpManager.getInstance()获取到该对象
    public static OKHttpManager getInstance() {
        return okHttpManager;
    }
}


推荐使用:静态内部类

public class OKHttpManager {
//静态内部类代码
    //注意1.外界不能造对象,无参构造方法必须私有
    private OKHttpManager() {
    }

    //注意2.创建一个私有的静态内部类,并(new)创建类的对象实例
    private static class OKHttpManagerHolder {
        private static final OKHttpManager okHttpManagr = new OKHttpManager();
    }

    //注意3.提供一个公共的get()方法(方法名可以任意取),返回静态内部类中的实例
    // 通过OKHttpManager.get()获取到该对象
    public static OKHttpManager get(){
        return OKHttpManagerHolder.okHttpManagr;
    }
}
此方法是结合了懒汉式的延时加载饿汉式的创建时的直接实例类对象避免的线程安全的问题

双重检验锁,静态内部类的写法

有关对以上代码的考虑线程安全等原因,可以参考这篇文章:http://blog.csdn.net/jason_996/article/details/78617592


发布了74 篇原创文章 · 获赞 58 · 访问量 24万+

猜你喜欢

转载自blog.csdn.net/Jason_996/article/details/78617258
今日推荐