Android单例模式你应该知道到一切
来源:互联网 发布:魔方数据是什么 编辑:程序博客网 时间:2024/04/28 22:03
前言
单例模式想必大家都使用过,但是也许你并不完全了解它,在这里我就来详细介绍一下所有的单例模式,及单例模式中涉及的一些细节问题。
一、单例模式的作用
保证了单利类的对象只有一个实例存在,利于协调系统整体的行为。
二、单利的模式的使用场景
确保某个类只有一个对象的场景,避免产生多个对象,消耗过多的资源,或者某种类型的对象应该只有一个。例如需要访问IO和数据库等资源时,就需要考虑使用单例模式。
三、单利模式的UML图
角色介绍:
(1)Client:客户端,即调用者
(2)Singleton:单例类
实现单利类需要注意关键点如下:
(1)构造函数不对外开放,一般为private
(2)通过一个静态方法或者枚举返回单利类的对象
(3)确保单利类的对象有且只有一个,尤其是在多线程下。
(4)确保单利类的对象在返序列化的时候不会重新构建对象。
四、单例模式的种类
单例模式主要分为以下几种
1)饿汉模式
/*** * 饿汉式 * * 优点:多线程安全 * 缺点:提前加载内存,占用内存。 * */ private static Singleton instance = new Singleton(); private Singleton(){} public static Singleton getInstance(){ return instance; }
2)懒汉模式1
/*** * 懒汉式 * * 优点:随用随加载 * 缺点:多线程是不安全的 * */ private static Singleton instance = null; private Singleton(){} public static Singleton getInstance(){ if (instance == null){ instance = new Singleton(); } return instance; }
3)懒汉模式2
/*** * 懒汉式2:方法同步 * * 优点:随用随加载,多线程安全 * 缺点:第一次加载时需要及时进行初始化,反应慢。且每次调用getInstance时都进行了同步,造成不必要的开销 * */ private static Singleton instance = null; private Singleton(){} public static synchronized Singleton getInstance(){ if (instance == null){ instance = new Singleton(); } return instance; }
4)懒汉模式3
此种方法也是使用人数比较多的
/*** * 懒汉式3:Double Check Lock(DCL) 双检查锁 * * 优点:资源利用率高,随用随加载,多线程安全,2次判空,避免不必要的同步锁,节省资源。 * 缺点:第一次加载反应稍慢 * * PS:volatile的作用:由于JDK1.5之前,JVM对于类的加载机制的问题会导致失效,在1.5之后加上此关键字可以保证DCL单利不失效。 * */ private volatile static Singleton instance = null; private Singleton(){} public static Singleton getInstance(){ if (instance == null){ synchronized(Singleton.class){ if (instance == null){ instance = new Singleton(); } } } return instance; }
5)静态内部类的单利模式
此种单利模式,推荐使用,效果好。
/*** * 静态内部类的单利模式:推荐使用的模式 * * 优点:多线程安全,延迟加载 * 缺点: * */ private Singleton(){} public static Singleton getInstance(){ return SingletonHolder.instance; } /*** * 静态内部类 */ private static class SingletonHolder{ private static final Singleton instance = new Singleton(); }
6)枚举的单利模式
/*** * 枚举的单例模式 * * 优点:写法简单,枚举默认是线程安全,并且在任何情况下它都只有一个实例,支持反序列化。 * 缺点: * * PS:上面几种单例模式在反序列化的时候都会生成新的对象,但是枚举不会。如果上面几种方法要想反序列化 * 的时候也不生成新的实例就需要重写 readResolve()方法,如下: * * private Object readResolve() throws ObjectStreamException{ * return instance; * } * */ public enum SingletonEnum{ INSTANCE; }
7)使用容器实现单利模式
/*** * 使用容器实现单例模式 * * 优点:将多种单利类型放在统一的管理类中,使用使根据key获取单利对象。降低用户使用成本,也对用户隐藏了具体实现,降低耦合 * 缺点: * */ public class SingletonManager{ private static Map<String,Object> objMap = new HashMap<>(); private SingletonManager(){} public static void registerSingleton(String key,Object instance){ if (!objMap.containsKey(key)){ objMap.put(key,instance); } } public static Object getSingleton(String key){ return objMap.get(key); } }
五、结语
不关以哪种方式实现的单利模式,他们的核心都是之前说到的4点
(1)构造函数不对外开放,一般为private
(2)通过一个静态方法或者枚举返回单利类的对象
(3)确保单利类的对象有且只有一个,尤其是在多线程下。
(4)确保单利类的对象在返序列化的时候不会重新构建对象。
至于到底选择哪种单例模式,试自己项目而定。
如有错误还请指出!(^o^)/~
0 0
- Android单例模式你应该知道到一切
- 单例模式,你所应该知道的一切
- Android Fragment 你应该知道的一切
- 【Android】Fragment 你应该知道的一切
- Android Fragment 你应该知道的一切
- Android Fragment 你应该知道的一切
- Android Fragment 你应该知道的一切
- Android Fragment 你应该知道的一切
- Android Fragment 你应该知道的一切
- Android Fragment 你应该知道的一切
- Android Fragment 你应该知道的一切
- Android Fragment 你应该知道的一切
- Android Fragment 你应该知道的一切
- Android Fragment 你应该知道的一切
- Android Fragment 你应该知道的一切
- Android Fragment 你应该知道的一切
- Android Fragment 你应该知道的一切
- Android Fragment 你应该知道的一切
- media queries常用介绍及兼容性问题解决
- 计算机词汇-computer words
- struts2框架_01
- 深入理解Java虚拟机到底是什么
- [ZJOI2008]骑士
- Android单例模式你应该知道到一切
- 手把手带你实现Markdown编辑器语法高亮
- 国内外IT公司的兴衰发展介绍。
- 安装初始化mysql后,默认几个库介绍
- 完美卸载Oracle
- Golang语言学习之占位符“_”(下划线)
- centos7(vm)下 mysql安装(x86)
- elasticsearch-5.1.1 安装的问题
- MacOS上git命令的自动补全功能