首页 > 代码库 > 单例模式
单例模式
单例模式分三种:懒汉式单例、饿汉式单例、登记式单例三种。
主要优点:
1) 减少创建Java实例所带来的系统开销
2) 便于系统跟踪单个Java实例的生命周期、实例状态等。
主要缺点:
1、由于单利模式中没有抽象层,因此单例类的扩展有很大的困难。
2、单例类的职责过重,在一定程度上违背了“单一职责原则”。
3、滥用单例将带来一些负面问题,如为了节省资源将数据库连接池对象设计为的单例类,可能会导致共享连接池对象的程序过多而出现连接池溢出;如果实例化的对象长时间不被利用,系统会认为是垃圾而被回收,这将导致对象状态的丢失。
一、懒汉式单例
在类被加载的时候,唯一实例已经被创建。这个设计模式在Java中容易实现,在别的语言中难以实现。
public class LazySingleton {
/** * 私有静态对象,加载时候不做初始化 */
private static LazySingleton m_intance=null;
/** * 私有构造方法,避免外部创建实例 */
private LazySingleton(){
}
/** 静态工厂方法,返回此类的唯一实例.当发现实例没有初始化的时候,才初始化. */
synchronized public static LazySingleton getInstance(){
if(m_intance==null){
m_intance=new LazySingleton();
}
return m_intance;
}
}
二、饿汉式单例
在类加载的时候不创建单例实例。只有在第一次请求实例的时候的时候创建,并且只在第一次创建后,以后不再创建该类的实例。
public class EagerSingleton {
/** * 私有的(private)唯一(static final)实例成员,在类加载的时候就创建好了单例对象 */
private static final EagerSingleton m_instance = new EagerSingleton();
/** * 私有构造方法,避免外部创建实例 */
private EagerSingleton() {
}
/** * 静态工厂方法,返回此类的唯一实例. * @return EagerSingleton */
public static EagerSingleton getInstance() {
return m_instance;
}
}