欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Android设计模式之单例模式

程序员文章站 2022-07-14 09:16:47
...

单例模式应该是在安卓应用开发中最简单最常用的一种模式了。

但是知道单例模式的三种实现方式,以及他们之间的性能区别,则能更好运用到项目中去。

单例模式的实现主要有三种方式:

一、懒汉模式

实现方式:

private class Singleton{
    private static Singleton mInstance = null;
    private Singleton(){}
    private static synchronized Singleton getInstance(){
        if( null == mInstance ){
            mInstance = new Singleton();
        }
        return mInstance;
    }
}

懒汉模式的优点:
1、只有在使用时才会被初始化,在一定程度上节约了资源;

懒汉模式的缺点:
1、第一次加载时需要及时进行实例化(new),反应稍慢;
2、最大的问题,每次调用getInstance是都需要进行同步,造成了不必要的同步开销。

二、DCL方式

DCL:Double Check Lock,双重检查锁定
DCL实现了懒汉模式的优点,并且避免了懒汉的缺点,在需要时进行初始化,又能保证线程安全,初始化后调用getInstance不需要再进行同步锁。

实现方式:

private class Singleton{
    private static Singleton mInstance = null;
    private Singleton(){}
    private static Singleton getInstance(){
        if( null == mInstance ){
            synchronized(Singleton.class)
                if( null == mInstance )
                    mInstance = new Singleton();
        }
        return mInstance;
    }
}

三、静态内部类单例模式

DCL虽然在一定程度上解决了资源消耗,多余的同步和线程安全等问题,当时在某种特殊的情况下会出现失效的问题,这个问题被称为DCL失效。建议不适用DCL方式。
静态内部类单例模式实现了上述的优点,并避免了以上两种模式的缺点。
实现方式:

private class Singleton{
    private Singleton(){}
    private static Singleton getInstance(){
        returnSingletonHolder.mInstance;
    }

    private static class SingletonHolder{
        private static final Singleton mInstance = new Singleton();
    }
}

总结:
1、在内存中只有一个实例,减少了内存开支;
2、减少了系统性能开销;
3、避免对资源的多重占用,例如一个写文件操作,由于只有一个实例,避免了对同一个资源文件的同时写操作。
4、单例模式作为一个系统设置全局的访问点,优化和共享了资源访问。例如,可以设计一个单例类,负责所有数据表的映射处理。

缺点:
1、扩展性差;
2、单例对象如果持有Context,很容易引发内存泄漏,此时需要注意传递给单例对象的Context最好是Application Context.