Android应用开发连载首页投稿(暂停使用,暂停投稿)程序员

羊皮书APP(Android版)开发系列(二十二)10分钟秒懂单

2016-04-18  本文已影响571人  JeenWang

单例模式在实际开发过程中经常会用到,我们有必要充分的理解单例模式。单例模式有多种写法,分为懒汉式、饿汉式、双重锁等。

单例模式的定义:

单例模式的好处:

  1. 对于频繁使用的对象,可以省略创建对象所花费的时间,这对于那些重量级对象而言,是非常可观的一笔系统开销;
  2. 由于 new 操作的次数减少,因而对系统内存的使用频率也会降低,这将减轻 GC 压力,缩短 GC 停顿时间。

饿汉式:

public class Singleton1 {
    //私有的默认构造子
    private Singleton() {}
    //已经自行实例化 
    private static final Singleton single = new Singleton();
    //静态工厂方法 
    public static Singleton getInstance() {
        return single;
    }
}

懒汉式(一):

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 class SingletonHolder {  
        private static final Singleton INSTANCE = new Singleton();  
    }  
    private Singleton (){}  
    public static final Singleton getInstance() {  
        return SingletonHolder.INSTANCE; 
    }  
}

双重校验锁:

public class Singleton {
    private volatile static Singleton singleton;

    private Singleton() {
    }

    public static Singleton getSingleton() {
        if (singleton == null) {
            synchronized (Singleton.class) {
                if (singleton == null) {
                    singleton = new Singleton();
                }
            }
        }
        return singleton;
    }
} 

总结:

  1. 《懒汉式(二)》很常见,但是一般会偏向使用《静态内部类》的方式。
  2. 《双重校验锁》方式也很好,但是它会受到JDK的约束,如果在JDK 1.5及以上使用完全没有问题。
  3. 在Android开发中,在开源框架Android-Universal-Image-Loader的ImageLoader中就是使用《双重校验锁》的方式,所以在Android开发中,我们可以直接使用《双重校验锁》的方式。
  4. Android开发中,单例模式常会用于我们的对业务的封装类中,如:对网络请求的封装、图片加载的封装等。

单例模式使用的一个实际例子见下一篇

上一篇下一篇

猜你喜欢

热点阅读