Java设计模式----单例模式
2015-07-12 15:27
288 查看
从今天开始,自己深入研究一下Java的设计模式。设计模式是前人工作的总结和提炼。如果能合理地运用设计模式,不仅使系统更容易被他人理解,同时也能够使系统拥有更加合理结构。单例模式是最常用的设计模式之一,今天就整理一下单例模式的知识。
单例模式的概念
单例模式的好处
单例模式的类图
单例模式的实现
1、对于频繁使用的对象,可以省略创建对象所花的时间,这对于那些重量级的对象而言,是非常可观的提笔开销。
2、由于new操作的次数减少,因而对系统内存的使用频率也会降低,这将减少GC的压力,缩短GC提顿时间。
因此对于系统的关键组件和被频繁使用的对象,使用单例模式便可以有效地改善系统的性能。
![](http://img.blog.csdn.net/20150712145200777)
这种单例的实现方式比较简单,它的不足在于:无法对instance做延迟加载。假如单例的创建过程很慢,而由于instance 成员变量是static定义的,因此JVM加载单例类时,单例就会被创建,如果此时,这个单例类在系统中还扮演其他角色,那么在任何使用这个单例类的地方都会初始化这个单例变量。
第二种实现方法(加入了延迟加载)
这种单例模式实现了延迟加载的功能,但是由于引入了同步关键字,使得系统性能降低,有些得不偿失。
第三种实现方法(使用内部类)
使用内部类的方式实现单例,既可以 做到延迟加载,也不必须使用同步关键字,是一种比较完善的做法。(解释:当StaticSingleton被加载时,其内部类不会被初始化,故可以确保当StaticSingleton 类被载入JVM时,不会初始化单例类,而当getInstance()方法被调用时,才会加载内部类,从而初始化instance。由于实例的建立是在类加载时完成的,故对多线程友好,getInstance()也不需要同步关键字。)
单例模式的概念
单例模式的好处
单例模式的类图
单例模式的实现
单例模式的概念
单例模式概念: 是一种对象创建模式,用于产生一个对象的具体实例,它可以确保系统中一个类只产生一个实例。单例模式的优点
在Java语言中,能带来以下两点好处:1、对于频繁使用的对象,可以省略创建对象所花的时间,这对于那些重量级的对象而言,是非常可观的提笔开销。
2、由于new操作的次数减少,因而对系统内存的使用频率也会降低,这将减少GC的压力,缩短GC提顿时间。
因此对于系统的关键组件和被频繁使用的对象,使用单例模式便可以有效地改善系统的性能。
单例模式的类图
单例模式的实现
第一种实现方法public class Singleton { //私有化构造函数,这样保证单例不会在系统中的其他代码内被实例化 private Singleton(){ } //instance和getInstance必须是static private static Singleton instance = new Singleton(); public static Singleton getInstance(){ return instance; } }
这种单例的实现方式比较简单,它的不足在于:无法对instance做延迟加载。假如单例的创建过程很慢,而由于instance 成员变量是static定义的,因此JVM加载单例类时,单例就会被创建,如果此时,这个单例类在系统中还扮演其他角色,那么在任何使用这个单例类的地方都会初始化这个单例变量。
第二种实现方法(加入了延迟加载)
public class LazySinglen { //私有化构造函数,这样保证单例不会在系统中的其他代码内被实例化 private LazySinglen(){ } //instance和getInstance必须是static private static LazySinglen instance = null; public static synchronized LazySinglen getInstance(){ if (instance == null){ instance = new LazySinglen(); } return instance; } }
这种单例模式实现了延迟加载的功能,但是由于引入了同步关键字,使得系统性能降低,有些得不偿失。
第三种实现方法(使用内部类)
public class StaticSingleton { private StaticSingleton(){ } private static class SingletonHolder{ private static StaticSingleton instance = new StaticSingleton(); } public static StaticSingleton getInstance(){ return SingletonHolder.instance; } }
使用内部类的方式实现单例,既可以 做到延迟加载,也不必须使用同步关键字,是一种比较完善的做法。(解释:当StaticSingleton被加载时,其内部类不会被初始化,故可以确保当StaticSingleton 类被载入JVM时,不会初始化单例类,而当getInstance()方法被调用时,才会加载内部类,从而初始化instance。由于实例的建立是在类加载时完成的,故对多线程友好,getInstance()也不需要同步关键字。)
相关文章推荐
- Java关键字static、final使用小结
- JAVA的核心概念:接口(interface)
- Java根据当前日期获得这一周的日期
- java编程思想——java IO系统
- Struts2 + uploadify 多文件上传完整的例子!
- 写代码质量改善java计划151建议——导航开始
- 在MyEclipse安装目录看不完整的目录
- spring里面事务的传播属性和事务隔离级别
- java基础——Vector集合知识点
- Palindrome Linked List
- Java基础知识
- Spring+mybatis中事务管理
- 在eclipse中配置NDK的自动编译环境
- eclipse中的注释快捷键
- java异常分析(一)
- Ubuntu 14 配置eclipse
- java短信生成6位数的校验码
- java List 排序 Collections.sort() 对 List 排序
- Java的List和Map作为入参与clone
- [Android]反编译apk + eclipse中调试smali