设计模式之单例模式

转载 2013年12月04日 09:56:15

一、简介

1、单例模式是一种对象创建模式,用于产生一个对象的具体实例,它可以确保系统中一个类只产生一个实例。

2、在Java中,单例模式带来的好处如下:

  • 对于频繁使用的对象,可以省去创建对象所花费的时间。
  • 由于使用new关键字操作的次数减少,所以对系统内存的使用频率也会降低,这将减轻GC的压力,缩短GC停顿时间。

二、单例模式类图

1、单例模式的参与者只有单例类和使用者,其中单例类提供单例的工厂,返回单例对象;而使用者获取并使用单例类。如下图:

三、Java语言实现单例模式

1、方式一

如下代码所示,单例类的构造方法必须私有化,这样才能确保单例类不会在系统中的其它代码内被实例化。

  1. public class Singleton {  
  2.       
  3.     private static Singleton instance = new Singleton();  
  4.   
  5.     // 构造方法私有化  
  6.     private Singleton() {  
  7.           
  8.     }  
  9.       
  10.     public static Singleton getInstance() {  
  11.         return instance;  
  12.     }  
  13. }  

缺点:无法对instance实例做延迟加载。由于instance变量是static定义的,所以在JVM加载单例类后,首次主动使用单例类时,单例对象就会被创建。

2、方式二

如下代码所示,这种方式就能达到延迟加载的要求,但是getInstance方法必须是同步的,否则在多线程环境下,可能会导致多个实例被创建

  1. public class Singleton {  
  2.       
  3.     private static Singleton instance;  
  4.   
  5.     // 构造方法私有化  
  6.     private Singleton() {  
  7.           
  8.     }  
  9.       
  10.     public static synchronized Singleton getInstance() {  
  11.         if (instance == null) {  
  12.             instance = new Singleton();  
  13.         }  
  14.         return instance;  
  15.     }  
  16. }  

缺点:由于引入了同步关键字,在多线程环境下它的时耗要远远大于第一种实现方式。

3、方式三

如下代码所示,单例模式使用内部类来维护单例类的实例,当Singleton类被加载时,其被内部类并不会被初始化,所以可以确保当Singleton类被载入JVM时,不会初始化单例类;而当getInstance方法被调用时,才会去加载SingletonHolder类,而当执行SingletonHolder.instance时,由于是对SingletonHolder类的首次主动使用,所以此时才会初始化instance。同时,由于实例的建立是在类加载时完成,所以天生对多线程友好,getInstance方法不再需要使用同步关键字。

  1. public class Singleton {  
  2.       
  3.     // 构造方法私有化  
  4.     private Singleton() {  
  5.           
  6.     }  
  7.       
  8.     private static class SingletonHolder {  
  9.         private static Singleton instance = new Singleton();  
  10.     }  
  11.       
  12.     public static Singleton getInstance() {  
  13.         return SingletonHolder.instance;  
  14.     }  
  15. }  
优点:使用内部类方式实现单例,既可以做到延迟加载,也不必使用同步关键字。

设计模式学习之单例模式

  • 2013年12月11日 21:43
  • 5KB
  • 下载

23钟设计模式之单例模式

  • 2013年08月13日 10:41
  • 26KB
  • 下载

六种常用的设计模式java实现(二)单例模式

上一节说完了工厂模式,那么,接下来给大家介绍下单例模式。单例模式想必大家应该都用得比较多,特别是在spring中,我们的java bean对象一般都是单例的。像项目中某些类只会被实例化一次或者只能实例...

设计模式之单例模式程序

  • 2010年05月18日 10:28
  • 3KB
  • 下载

java设计模式之单例模式详解

  • 2012年11月02日 17:53
  • 33KB
  • 下载

JAVA设计模式之单例模式

概念:   java中单例模式是一种常见的设计模式,单例模式分三种:懒汉式单例、饿汉式单例、登记式单例三种。   单例模式有一下特点:   1、单例类只能有一个实例。   2、单例类必须自己自己创建自...

设计模式单例模式

  • 2014年10月10日 20:56
  • 4KB
  • 下载

设计模式(十七)——单例模式

单例模式(Singleton) 单例模式,保证一个类仅有一个实例,并提供一个访问它的全局访问点。...

设计模式之单例模式

  • 2012年04月10日 17:38
  • 728B
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:设计模式之单例模式
举报原因:
原因补充:

(最多只允许输入30个字)