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与模式》 阎宏
没有评论:
发表评论