设计模式之单例模式
来源:互联网 发布:网络监听 编辑:程序博客网 时间:2024/06/05 16:06
一、简介
1、单例模式是一种对象创建模式,用于产生一个对象的具体实例,它可以确保系统中一个类只产生一个实例。
2、在Java中,单例模式带来的好处如下:
- 对于频繁使用的对象,可以省去创建对象所花费的时间。
- 由于使用new关键字操作的次数减少,所以对系统内存的使用频率也会降低,这将减轻GC的压力,缩短GC停顿时间。
二、单例模式类图
1、单例模式的参与者只有单例类和使用者,其中单例类提供单例的工厂,返回单例对象;而使用者获取并使用单例类。如下图:
三、Java语言实现单例模式
1、方式一
如下代码所示,单例类的构造方法必须私有化,这样才能确保单例类不会在系统中的其它代码内被实例化。
- public class Singleton {
- private static Singleton instance = new Singleton();
- // 构造方法私有化
- private Singleton() {
- }
- public static Singleton getInstance() {
- return instance;
- }
- }
缺点:无法对instance实例做延迟加载。由于instance变量是static定义的,所以在JVM加载单例类后,首次主动使用单例类时,单例对象就会被创建。
2、方式二
如下代码所示,这种方式就能达到延迟加载的要求,但是getInstance方法必须是同步的,否则在多线程环境下,可能会导致多个实例被创建
- public class Singleton {
- private static Singleton instance;
- // 构造方法私有化
- private Singleton() {
- }
- public static synchronized Singleton getInstance() {
- if (instance == null) {
- instance = new Singleton();
- }
- return instance;
- }
- }
缺点:由于引入了同步关键字,在多线程环境下它的时耗要远远大于第一种实现方式。
3、方式三
如下代码所示,单例模式使用内部类来维护单例类的实例,当Singleton类被加载时,其被内部类并不会被初始化,所以可以确保当Singleton类被载入JVM时,不会初始化单例类;而当getInstance方法被调用时,才会去加载SingletonHolder类,而当执行SingletonHolder.instance时,由于是对SingletonHolder类的首次主动使用,所以此时才会初始化instance。同时,由于实例的建立是在类加载时完成,所以天生对多线程友好,getInstance方法不再需要使用同步关键字。
- public class Singleton {
- // 构造方法私有化
- private Singleton() {
- }
- private static class SingletonHolder {
- private static Singleton instance = new Singleton();
- }
- public static Singleton getInstance() {
- return SingletonHolder.instance;
- }
- }
- 设计模式之 单例设计模式
- 设计模式之 单例设计模式
- 设计模式之单例设计模式
- 设计模式之-----------单例设计模式
- 设计模式之:单例设计模式
- 设计模式之单例设计模式
- 设计模式之单例设计模式
- 设计模式之单例设计模式
- 设计模式之单例设计模式
- 设计模式之单例设计模式
- 设计模式之单例设计模式
- 设计模式之单例设计模式
- 设计模式之单例设计模式
- 设计模式之-单例设计模式
- 设计模式之单例设计模式 标签: 设计模式
- 设计模式之单例
- 设计模式之单例
- 设计模式之 单例
- 嵌套类
- JAVA uuid的使用
- 文件重命名操作
- Eclipse中的SVN还原到服务器的版本(跟服务器同步)
- JAVA中的数据字典
- 设计模式之单例模式
- 常用的Oracle查询语句
- PLSQL导入和导出工具的使用
- NSCache和NSURLCache
- 如何将windows里面的文件导入到Linux虚拟机中
- 新的起点,新的开始
- 如何制作ISO软件包(这里使用UltraISO工具)
- 让Eclipse提示方法的注释信息
- 类型“System.Web.WebPages.Razor.WebPageRazorHost”违反了继承安全性规则