设计模式之单例模式
2015-12-08 22:20
363 查看
单例模式是23种设计模式中最为简单的一种。
单例模式定义
Ensure a class has only one instance, and provide a global point of access to it.
(确保某一个类只有实例,并向整个系统提供这是实例)
通常情况下,单例模式实现有两种方式。
饿汉式单例
懒汉式单例
具体实现根据实际情况不同,分为以下几种。
懒汉式单例(非线程安全)
这种懒汉式是最通俗易懂的写法,一般非多线程环境下,可直接使用。
2.懒汉式单例(线程安全)
通过synchronized关键字可以保证多线程模式下,内存中实例也会只有一个。但是大部分情况下,并不需要同步,影响效率。
3.饿汉式单例
通过classloader,在类加载的时候,就会在内存中创建一个实例。不管你需不需要使用这个实例。若在某个逻辑条件下,并需要这个单例实例,就会造成内存的浪费。
4.静态内部类
这种方式与第3种方式都是利用classloader进行控制。不同的是第四种方式在装载Singleton类时,并不会去实例化单例。只有在调用getInstance方法后,才会进行加载,实现了懒加载。
5.枚举式
这种方式是Effective Java作者Josh Bloch 提倡的方式,它不仅能避免多线程同步问题,而且还能防止反序列化重新创建新的对象,可谓是很坚强的壁垒啊,不过,个人认为由于1.5中才加入enum特性,用这种方式写不免让人感觉生疏,在实际工作中,我也很少看见有人这么写过。
总结:
个人而言,如果实例对象不是很大的话,一般用第三种就可以了。
如果考虑运行时内存大小,推荐第三种,也是比较常用的一种用法。
单例模式定义
Ensure a class has only one instance, and provide a global point of access to it.
(确保某一个类只有实例,并向整个系统提供这是实例)
通常情况下,单例模式实现有两种方式。
饿汉式单例
懒汉式单例
具体实现根据实际情况不同,分为以下几种。
懒汉式单例(非线程安全)
public class Singleton { private static Singleton instance; private Singleton (){} public static Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } }
这种懒汉式是最通俗易懂的写法,一般非多线程环境下,可直接使用。
2.懒汉式单例(线程安全)
public class Singleton { private static Singleton instance; private Singleton (){} public static synchronized Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } }
通过synchronized关键字可以保证多线程模式下,内存中实例也会只有一个。但是大部分情况下,并不需要同步,影响效率。
3.饿汉式单例
public class Singleton { private static Singleton instance = new Singleton(); private Singleton (){} public static Singleton getInstance() { return instance; } }
通过classloader,在类加载的时候,就会在内存中创建一个实例。不管你需不需要使用这个实例。若在某个逻辑条件下,并需要这个单例实例,就会造成内存的浪费。
4.静态内部类
public class Singleton { private static class SingletonHolder { private static final Singleton INSTANCE = new Singleton(); } private Singleton (){} public static final Singleton getInstance() { return SingletonHolder.INSTANCE; } }
这种方式与第3种方式都是利用classloader进行控制。不同的是第四种方式在装载Singleton类时,并不会去实例化单例。只有在调用getInstance方法后,才会进行加载,实现了懒加载。
5.枚举式
public enum Singleton { INSTANCE; public void whateverMethod() { } }
这种方式是Effective Java作者Josh Bloch 提倡的方式,它不仅能避免多线程同步问题,而且还能防止反序列化重新创建新的对象,可谓是很坚强的壁垒啊,不过,个人认为由于1.5中才加入enum特性,用这种方式写不免让人感觉生疏,在实际工作中,我也很少看见有人这么写过。
总结:
个人而言,如果实例对象不是很大的话,一般用第三种就可以了。
如果考虑运行时内存大小,推荐第三种,也是比较常用的一种用法。
相关文章推荐
- 为什么要Code Review
- 快速排序算法总结
- 使用 IntelliJ IDEA 开发 Android 应用程序时配置 Allatori 进行代码混淆
- Openwrt笔记
- ERR_NAME_NOT_RESOLVED错误的解决
- OC - 第七章 类的扩展: 类目Category, 延展Extension, 协议Protocol ( 二 )
- RTEMS开发环境搭建——基于FreeBSD系统
- iOS技术面试03:Foundation
- ERROR BUILDING VIM on Ubuntu--Solution
- zzulioj 1810: water problem II (字符转换) 水
- dubbo负载均衡策略--- 一致哈希算法
- Android Studio——自定义ListView子项目布局
- STM32学习笔记(3):时钟配置
- Scala 第十六讲 隐函数 从大数据菜鸟走上大师的历程
- 如何更好的通过Inflate layout的方式来实现自定义view
- lct模板
- Url Protocol-从网页中打开应用程序(exe)-使用小记
- 在eclipse中怎样给项目添加关联项目
- 单点登录SSO
- iOS技术面试02:内存管理