单例模式

2019-11-05  本文已影响0人  汇源可乐

安卓常用的设计模式

单例模式的6种写法:

饿汉模式,懒汉模式(线程不安全),懒汉模式(线程安全),双重检查模式(DCL),静态内部类模式,枚举单例
饿汉模式
public class Singleton
{
    private static Singleton instance=new Singleton();
    private Singleton(){}
    public static Singleton getInstance()
    {
        return instance;
    }
}
懒汉模式(线程不安全)
public class Singleton
{
    private static Singleton instance;
    private Singleton(){}
    public static Singleton getInstance()
    {
        if(instance==null)
            instance=new Singleton();
        return instance;
    }
}
懒汉模式(线程安全)
public class Singleton
{
    private static Singleton instance;
    private Singleton(){}
    public static synchronized Singleton getInstance()
    {
        if(instance==null)
            instance=new Singleton();
        return instance;
    }
}
双重检查模式
public class Singleton
{
    private static volatile Singleton instance;
    private Singleton(){}
    public static Singleton getInstance()
    {
        if(instance==null)
        {
            synchronized(Singleton.class)
            {
                if(instance==null)
                {
                    instance=new Singleton();
                }
            }
        }
        return instance;
    }
}

两次检查的作用:第一次,通过检查类对象是否为空来减少进入同步的次数,

第二次检查:只有类对象为空的时候才会进入检查,这样用同步关键字来保证多线程时类对象只会被创建一次

静态内部类
public class Singleton
{
    private Singleton(){}
    public static Singleton getInstance()
    {
        return SingletonHolder.instance;
    }
    private static class SingletonHolder{
        private static final Singleton instance=new Singleton();
    }
}
枚举单例
public enum Singleton{
    INSTANCE;
    public void doSomething()
    {
        
    }
}

上述单例的实现模式,会在反序列化的时候重新创建对象。{将一个单例实例对象写到磁盘再都回来,从而得到一个实例}

杜绝反序列化时对象宠幸创建的解决方法:

private Object readResolve() throws ObjectStreamException{
    return singleton;
}

单例模式在安卓的许多源码中都有所体现,通常使用的是DCL这种方式来构造单例模式,比如在EventBus事件中,就是用了DCL的单例模式,而使用各种模式最多的开源网络框架Retrofit也有使用单例模式,学习好设计模式是能读懂各种源码的基本要求。

引用来源

上一篇下一篇

猜你喜欢

热点阅读