Android单例模式

来源:互联网 发布:python量化投资 pdf 编辑:程序博客网 时间:2024/05/06 17:31

最近几天抽空阅读了<<Android源码设计模式>>中单例模式,下面是我的阅读笔记.


单例模式就是在有的类中避免产生多个对象消耗过多的资源,必须保证只有一个实例存在,例如访问I/O和数据库等资源类.

实现单例模式主要有如下几个关键点:

    1.构造函数不对外开放,一般为private

    2.通过一个静态方法或者枚举返回单例类对象

    3.确保单例类的对象有且只有一个,,尤其是在多线程huanjingxia

    4.确保单例类对象在反序列化时不会从新构建对象.


下面是几种单例的demo:

</pre><pre name="code" class="java">/** * 饿汉式: */public class SingleTon0 {    private SingleTon0() {    }    private static final SingleTon0 single = new SingleTon0();    public static SingleTon0 getInstance() {        return single;    }}
/** * 懒汉式,优点:单例只有在使用时才会被实例化,在一定程度上节约了资源; *        缺点:第一次加载时需要及时进行实例化,反应稍慢,每次调用getInstance都进行同步,造成不必要的同步开销 */class SingleTon1 {    private SingleTon1() {    }    private static SingleTon1 single;    public static synchronized SingleTon1 getInstance() {        if (null == single) {            single = new SingleTon1();        }        return single;    }}
/** * DCL模式 * 优点:既能节省资源又能保证线程安全,且单例对象初始化后调用getInstance不进行同步锁 * 缺点:第一次加载时反应稍慢,也由于java内存模型的原因偶尔会失败. */class SingleTon2 {    private SingleTon2() {    }    private static SingleTon2 single;    public static SingleTon2 getInstance() {        if (null == single) {            synchronized (SingleTon2.class) {                if (null == single) {                    single = new SingleTon2();                }            }        }        return single;    }}
class SingleTon3 {    private SingleTon3() {    }    public static SingleTon3 getInstance() {        return SingleTonHolder.instance;    }    /**     * 静态内部类     * 优点:线程安全,保证单例唯一,同时延迟了单例的实例化,解决了DCL单例模式的缺点    */    private static class SingleTonHolder {        private static final SingleTon3 instance = new SingleTon3();    }}
/** * 枚举类 */enum SingleTon4 {    INSTANCE;    public void doSomething() {        System.out.print("do thing");    }}
/** * 单例对象管理类 * 将多种单例类对象存放入单例管理类中同意管理,使用时通过key获取与之相对应的对象,他对用户隐藏了具体实现,降低了耦合度. */class SingletonManager {    private static Map<String, Object> obj = new HashMap<>();    private SingletonManager() {    }    public static void registerService(String key, Object instance) {        if (!obj.containsKey(key)) {            obj.put(key, instance);        }    }    Handler handler = new Handler(){        @Override        public void handleMessage(Message msg) {            super.handleMessage(msg);        }    };    public static Object getInstance(String key) {        return obj.get(key);    }}



0 0
原创粉丝点击