Android设计模式-单例模式(Singleton Pattern)

来源:互联网 发布:日本经济数据 编辑:程序博客网 时间:2024/05/28 11:50

定义

    一个类有且仅有一个实例,并且自行实例化向整个系统提供。

特点

1.单例类只能有一个实例。

2.单例类必须自己创建自己的唯一实例。

3.单例类必须给所有其他对象提供这一实例。


实现方式

1.饿汉式

public class Singleton {    private static Singleton mInstance = new Singleton();    private Singleton() {    }    public static Singleton getInstance() {        return mInstance;    }}

使用:

Singleton instance = Singleton.getInstance(); 

优点:线程安全

缺点:没有懒加载(在类加载时就实例化了而不是在用到这个实例时)


2.懒汉式

2.1懒汉式一(不推荐使用)

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

优点:懒加载

缺点:线程不安全


2.2懒汉式二_同步锁(不推荐使用)

public class Singleton {    private static Singleton mInstance;    private Singleton() {    }    public static synchronized Singleton getInstance() {        if (mInstance == null) {            mInstance = new Singleton();        }        return mInstance;    }}
优点:懒加载、线程安全

缺点:效率低(每次调用getInstance方法都要同步,造成不必要的同步开销)


2.3懒汉式三_双重检查锁(Double Check Lock)

public class Singleton {    private volatile static Singleton mInstance;    private Singleton() {    }    public static Singleton getInstance() {        if (mInstance == null) {            synchronized (Singleton.class) {                if (mInstance == null) {                    mInstance = new Singleton();                }            }        }        return mInstance;    }}
优点:懒加载、线程安全

缺点:第一次加载时反应稍慢(同步锁),也由于Java内存模型的原因偶尔失败。

3.静态内部类

public class Singleton {    private Singleton() {    }    private static class SingletonHolder {        private static Singleton instance = new Singleton();    }    public static Singleton getInstance() {        return SingletonHolder.instance;    }}

优点:懒加载、线程安全

缺点:待补充

原理:第一次调用getInstance方法时JVM加载SingletonHolder类,从而完成instance的初始化。


4.枚举

public enum Singleton {    INSTANCE;    private Singleton() {    }    public void method() {    }}

使用:

Singleton.INSTANCE.method();

优点:线程安全、防反序列化

缺点:JDK1.5及以上

原理:默认枚举的创建是线程安全的,并且在任何情况下它都是一个单例。


总结

根据项目实际需要选择单例实现方式,推荐4.枚举>3.静态内部类>2.3懒汉式三_双重检查锁>1.饿汉式。


参考

《Android源码设计模式》

http://blog.csdn.net/dmk877/article/details/50311791

http://www.cnblogs.com/whoislcj/p/5543932.html





0 0
原创粉丝点击