2009年4月3日星期五

JavaDesign_006:单例模式 Singleton(摘录+整理)

1. 特点
(1)一个类只能有一个实例存在。
(2)只能由该类负责创建该唯一实例。
(3)只能由该类负责提供该唯一实例。

2. 两种实现单例模式的代码结构
(1)饿汉式单例类:在加载类时,唯一实例已经被创建出来了。
public class Singleton {
 private static final Singleton instance = new Singleton();

// 私有的构造函数
private Singleton() {}

 // 静态工厂方法
 public static Singleton getInstance() {
  return instance;   
 }
}

(2)懒汉式单例类:在第一次使用时才创建唯一实例。
public class Singleton {
 private static Singleton instance = null;


 // 静态工厂方法,注意使用了synchronized
 public static synchronized Singleton getInstance() {  
  if (instance==null)
    instance=new Singleton();
  return instance;   
}
}

两种方式比较:
从资源利用效率上来看,懒汉式比饿汉式要好些;
从响应速度上来看,饿汉式比要懒汉式好些;
特别是对于初始化时间较长的资源管理器来说,懒汉式容易引起多线程竞争。
因此,出于安全性考虑,一般使用饿汉式单例模式。

4. 单例模式在以下情况时可能会出现状态不一致的情况,即不能保证唯一实例
(1)跨多个JVM的分布式应用。比如,某个EJB在其JVM中调用了单例类,另一个EJB在其JVM中也调用了单例类。
(2)同一个JVM中多个类加载器。比如,多个Servlet引擎。

5. 典型应用场景
(1)资源管理器。
(2)计数器。
(3)数据库序列生成器。
(4)邮件服务器清单。该清单用聚集(Vector)表示,用单例模式管理该聚集。

参考文献:
1. 《设计模式》 板桥里人
2. 《Java与模式》 阎宏

没有评论: