单例模式学习

来源:互联网 发布:artrage for mac 中文 编辑:程序博客网 时间:2024/05/22 00:31

单例模式关键点
1、构造函数不对外开放,private化
2、通过一个静甜方法或者枚举返回单例对象
3、确保单例类的对象有且只有一个,尤其是在多线程环境下
4、确保单例类对象在反序列化时不会重新重构对象
写法一:DCL(Double CheckLock)(满足1.2.3即绝大部分情况)

public class Singleton {    /**     * JDK1.5版本volatile关键字才能正常使用,     * 必须使用volatile关键字     * 因为new Singleton()操作不是原子操作     * 1.给Singleton的实例分配内存     * 2.调用Singleton()的构造房函数,初始化成员字段     * 3.将sIntance对象指向分配的内存空间     */    private volatile static Singleton sInstance = null;    private Singleton() {    }    public static Singleton getInstance() {        if (sInstance == null) {            synchronized (Singleton.class) {                if (sInstance == null) {                    sInstance = new Singleton();                }            }        }        return sInstance;    }}

写法二 :静态内部类单例模式(满足1.2.3即绝大部分情况)

public class SingleInstanceDemo {    //私有化构造函数,防止通过构造函数初始化对象    private SingleInstanceDemo() {    }    //在第一次调用getInstacnce()方法加载该静态内部类,只生产一个实例    private static class SingleInstance {        private static final SingleInstanceDemo mInstance = new SingleInstanceDemo();    }    //通过此方法获取对象    public static SingleInstanceDemo getInstance() {        return SingleInstance.mInstance;    }}

写法三:枚举类型单例模式(满足1.2.3.4)

public enum SingletonDemo{     INSTANCE;     public void doSomething(){         System.out.println("la la la");     }}

例子:
RetrofitUtil单利模式封装

public class RetrofitUtil {    private static Retrofit sInstance;    private RetrofitUtil() {    }    /*超时设置*/    private static final int DEFAULT_TIMEOUT = 10;    public static Retrofit getInstance() {        return RetrofitHolder.mInstance;    }    private static class RetrofitHolder {        private static final Retrofit mInstance;        static {                //在这里进行Retrofit的定制工作                mInstance = new Retrofit.Builder()                        .baseUrl(mUrl)                        .bulid();                }    }}

以上参考《Android源码设计模式解析与实战》 何红辉,关爱民

0 0
原创粉丝点击