首页 > 代码库 > 单例模式

单例模式

单例模式分三种:懒汉式单例、饿汉式单例、登记式单例三种。

主要优点:

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;

  }
}