android的单例设计模式
2016-04-11 23:43
447 查看
单例模式是我们android运用最多的一种设计模式,确保一个类中只有一个实例,而且自行实例并向整个系统提供这个实例,常用来解决消耗资源的问题。避免产生多个对象的消耗过多的资源。
client:高层的客户端,环境类
SingleTon:单例类
通过一个静态方法或者枚举法得到这个单例的对象
确保单例的对象的只有一个,尤其是在多线程
确保在单例对象的反序列化也不会生成的对象
缺点:在未使用的情况下,就已经生成了一个单例,造成资源的浪费。反序列化会生成新的对象。
缺点:反序列化会生成新的对象,在处理多线程的时候,效率会慢,因为的同步的原因
缺点:解决了懒汉式的效率低的问题,但是还是没解决反序列化的问题。第一次加载较慢。另外在jdk1.5 以前的版本,有很小的概率的发生对象的单例的失败。
缺点:反序列化的问题。这个推荐使用的单例模式。
DBHelper
IO,常见的比如volley,
ImageLoader ,Glide
DiskLurCahe/MemoryLurCache
…
单例模式的uml图
client:高层的客户端,环境类
SingleTon:单例类
单例的主要的关键点
构造函数的应该私有化,不对外开放通过一个静态方法或者枚举法得到这个单例的对象
确保单例的对象的只有一个,尤其是在多线程
确保在单例对象的反序列化也不会生成的对象
单例模式的实现方式
饿汉式
class SingleTon{ private static SingleTon sInstance = new SingleTon(); private SingleTon(){} public static SingleTon getInstance(){ return sInstance; } }
缺点:在未使用的情况下,就已经生成了一个单例,造成资源的浪费。反序列化会生成新的对象。
懒汉式
class SingleTon{ private static SingleTon sInstance; private SingleTon(){} public static synchronized SingleTon getInstance(){ if(sInstance == null){ sInstance = new SingleTon(); } return sInstance; } }
缺点:反序列化会生成新的对象,在处理多线程的时候,效率会慢,因为的同步的原因
double check lock (dcl)
class SingleTon{ private static SingleTon sInstance; private SingleTon(){} public static SingleTon getInstance(){ if(sInstance == null){ synchronized(sInstance){ if(sInstance == null){ sInstance = new SingleTon(); } } } return sInstance; } }
缺点:解决了懒汉式的效率低的问题,但是还是没解决反序列化的问题。第一次加载较慢。另外在jdk1.5 以前的版本,有很小的概率的发生对象的单例的失败。
静态内部类
dcl 可能存在单例模式失效的问题。而且改动也很不是很好看class SingleTon{ private SingleTon(){} public static SingleTon getInsance(){ return SingleTonHolder.sInstance; } private static class SingleTonHolder{ private static final SingleTon sInstance = new SingleTon(); } }
缺点:反序列化的问题。这个推荐使用的单例模式。
枚举类型
枚举模式是java天然的单例模式enum SingleTon{ INSTANCE; }
使用容器
标准的做法是在取的时候,先检查容器中相应key存不存在的对象,如果不存在,则创建一个对象,返回并保存到容器中,供下次使用。class SingleTonManager{ private static Map<String,Object> sObjMap = new HashMap<String,Object>(); public static Object getSingleInstance(String key){ if(!sObjMap.contain(key)){ registerSingleInstance(key); } return sObjMap.get(key); } public static synchronized registerSingleInstance(String key){ Object object = instance(key); sObjMap.put(key,object); } }
解决反序列的问题
反序列化会使用到一个钩子的函数readResolve(),我们只需要的在这个函数的让其抛出异常即可并返回类中当前的instance对象,常见做法,private Object readResolve()throws ObjectSteamException{ return sInstance; }
android 实际开发的使用的场景
SharedPreferencesDBHelper
IO,常见的比如volley,
ImageLoader ,Glide
DiskLurCahe/MemoryLurCache
…
相关文章推荐
- Android Studio 教程
- Android 常用工具类之SPUtil,可以修改默认sp文件的路径
- Android Activity启动模式全面解析
- Android中使用Handler造成内存泄露的分析和解决
- [android] 手机卫士手势滑动切换屏幕
- Android Studio 更改工程名异常 :can't rename root module
- Android学习笔记1 Activty
- Android Studio Session 'MainActivity': Error Launching activity
- Android系统之init进程
- Android studio快捷键
- Android Studio 2.0下创建jni应用调用本地C函数
- Android中的Intent Filter匹配规则介绍
- Android调试系列之dumpsys命令
- Android Studio在线更新
- Android温故之-Activity
- Android---Adapter
- 【Android】10、使用显式Intent
- Android开源库项目集锦
- Android开发之ListView利用OnScrollListener实现分页加载数据
- Android:Sqlite插入或更新--replace