设计模式(六)单件模式-独一无二的对象

定义

单件模式,确保一个类只有一个实例,并提供一个全局访问点。

为什么会存在这种情况?

有一些对象其实我们只需要一个,比方说,线程池、缓存、对话框、处理偏好设置和注册表的对象、日志对象,充当打印机、显卡等设备的驱动程序的对象。事实上,这类对象只能有一个实例,如果制造出多个实例,就会导致许多问题产生,例如:程序的行为异常、资源使用过量,或者不一致的结果等。

经典单件模式(懒汉式)
  • 单线程下有用
  • 延迟创建对象,适用于创建对象后,可能会有沉重的负担情况。
public class Singleton{
  private static Singleton instance;
  private Singleton(){}
  public static Singleton getInstance(){
    if(instance == null){
      instance = new Singleton();// 用的时候才创建
    }
    return instance;
  }
}
饿汉式

创建对象,负担不重时可以这么用

public class Singleton{
  private static Singleton instance=new Singleton();// 上来就创建实例
  private Singleton(){}
  public static Singleton getInstance(){
    return instance;
  }
}
多线程单件模式:

考虑类多线程情况,给加上类synchronized关键字。

  • 但是,同步方法可能造成程序执行效率严重下降,因此在频繁调用的地方需要慎重考虑。
public class Singleton{
  private static Singleton instance;
  private Singleton(){}
  public static synchronized Singleton getInstance(){
    if(instance == null){
      instance = new Singleton();
    }
    return instance;
  }
}
双重检查加锁

在上一个基础上,优化了synchronized同步方法。

public class Singleton{
  private volatile static Singleton instance;//volatile关键字确保:当instance变量被初始化成单例时,多个线程正确地处理instance变量。
  private Singleton(){}
  public static synchronized Singleton getInstance(){
    if(instance == null){// 只有第一次才彻底执行完代码
      synchronzed(Singleton.class){
        if(instance == null){
            instance = new Singleton();
        }
      }
    }
    return instance;
  }
}

你可能感兴趣的:(设计模式(六)单件模式-独一无二的对象)