美文网首页
Android设计模式----单例模式

Android设计模式----单例模式

作者: 王世军Steven | 来源:发表于2016-11-24 09:39 被阅读33次

    1, 单例模式定义

    确保某一个类只有一个实例,并且自行实例并且向整个系统提供这个实例.
    

    2, 单例模式的实现方式.

    2.1 饿汉式

    public class CEO{
        // 创建静态对象.
        private static final CEO mCeo = new CEO();
        // 私有化构造方法.
        private CEO(){}
        // 共有静态方法,对外暴露获取单例对象接口 .
        public static CEO getCeo(){
            return mCeo;
        }
    }
    // 防止反序列化过程中重新创建对象.
    private Object readResolve() throws ObjectStreamException{
        return mInstance;
    }
    

    2.2 懒汉式

    // 懒汉式
    public class Singleton_1{
        private static Singleton_1 mInstance;
        public static synchronized Singleton_1 getInstance(){
            if(mInstance == null){
                mInstance = new Singleton_1();
            }
            return mInstance;
        }
    }
    // 防止反序列化过程中重新创建对象.
    private Object readResolve() throws ObjectStreamException{
        return mInstance;
    }
    

    优点 : 使用时才会被实例化,在一定程度上节约了资源.

    缺点 : 第一次加载时需要及时进行实例化,反应稍慢. 最大的问题是,每次调用都需要进行
    同步造成不必要的同步开销.这种模式一般不建议使用.

    2.3 Double Check Lock (DCL)单例模式

    // Double Check Lock (DCL)实现单例模式.
    public class Singleton {
        private static Singleton mInstance = null;
        private Singleton(){}
        public static Singleton getInstance(){
            if (mInstance == null){
                // 添加同步锁.
                synchronized(Singleton.class){
                    mInstance = new Singleton();
                }
            }
            return mInstance;
        }
    }
    // 防止反序列化过程中重新创建对象.
    private Object readResolve() throws ObjectStreamException{
        return mInstance;
    }
    

    优点 : 资源利用率高,效率高.
    确定 : 第一次加载时反应慢.

    2.4 内部静态类单例模式(推荐使用).

    // 内部静态了单例模式.
    public class Singleton {
        private Singleton(){}
        public static Singleton getInstance(){
            return SingletonHolder.mInstance;
        }
        // 静态内部类
        private static class SingletonHolder{
            // 第一加载Singleton类时并不会初始化mInstance,
            // 只有第一次调用getInstance 时才会导致mIntance 被初始化.
            private static final Singleton mInstance = new Singleton();
        }
    }
    // 防止反序列化过程中重新创建对象.
    private Object readResolve() throws ObjectStreamException{
        return mInstance;
    }
    

    2.5 枚举单例模式.

    // 枚举单例模式
    public enum SingletonEnum{
        INSTANCE;
        public void doSomething(){
            System.out.printlen("do sth");
        }
    }
    

    可以避免反序列化时重新创建对象.

    2.6 使用容器实现单例模式.

    // 容器实现单例模式
    public class SingletonManager {
        private static Map<String , Object> objMap = new HashMap<String , Object>();
        
        private SingletonManager(){}
        
        public static void registerService(String key , Object instance){
            if (!objMap.containsKey(key)){
                objMap.put(key,instance);
            }
        }
        
        public static Object getService(String key){
            return objMap.get(key);
        }
    }
    

    相关文章

      网友评论

          本文标题:Android设计模式----单例模式

          本文链接:https://www.haomeiwen.com/subject/vdrbpttx.html