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.