Android单例模式
2016-07-14 09:56
429 查看
最近几天抽空阅读了<<Android源码设计模式>>中单例模式,下面是我的阅读笔记.
单例模式就是在有的类中避免产生多个对象消耗过多的资源,必须保证只有一个实例存在,例如访问I/O和数据库等资源类.
实现单例模式主要有如下几个关键点:
1.构造函数不对外开放,一般为private
2.通过一个静态方法或者枚举返回单例类对象
3.确保单例类的对象有且只有一个,,尤其是在多线程huanjingxia
4.确保单例类对象在反序列化时不会从新构建对象.
下面是几种单例的demo:
[/code]
单例模式就是在有的类中避免产生多个对象消耗过多的资源,必须保证只有一个实例存在,例如访问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); } }
[/code]
相关文章推荐
- AndroidStudio 快捷键总结
- 在Android中如何通过点击edittext之外的部分使软键盘隐藏
- Android Wear开发 - 数据通讯 - 第零节 : 打包Wear应用(手机和手表应用如何连接)
- android 判断应用程序是否已安装
- android 定时提醒 - Notification
- Android中处理崩溃闪退错误
- Android Widget 桌面组件开发介绍
- Windows下快速搭建安卓开发环境Android studio
- 接上android来去电显示并增添自定义数据库(类似360通话)
- Android Wear开发 - 数据通讯 - 第四节 : 数据封装(解决不能序列化问题)
- Android Wear开发 - 数据通讯 - 第三节 : 事件处理
- Android:使用ButterKnife注解绑定控件后报NullPointException
- Android Wear开发 - 数据通讯 - 第二节 : 数据的发送与接收
- Android bitmap图片处理
- Android MVP理解
- Android开发工具国内下载地址
- Android Wear开发 - 数据通讯 - 第一节 : 连接数据层
- Android Wear开发 - 卡片通知 - 第二节 : 自定义Wear卡片样式
- 第三方图片加载ImageLoader
- Android Wear开发 - 卡片通知 - 第一节 : 添加Android Wear通知特性