单例模式


单例模式

一、什么是单例模式

这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。

注意:

  • 1、单例类只能有一个实例。

  • 2、单例类必须自己创建自己的唯一实例。

  • 3、单例类必须给所有其他对象提供这一实例。

二、什么情况下用单例模式

一个全局使用的类频繁地创建与销毁。当您想控制实例数目,节省系统资源的时候。

如何实现

一、饿汉式单例

public class HungrySingleton {
   private HungrySingleton(){
?
  }
   private final static HungrySingleton HUNGRY_SINGLETON = new HungrySingleton();
?
   public static HungrySingleton getInstance(){
       return HUNGRY_SINGLETON;
  }
}
  • 缺点:不使用也会创建,浪费空间。

二、懒汉式单例

public class LazeSingleton {
 
   private LazeSingleton(){
     
  }
   private volatile static LazeSingleton laze;
?
   public static LazeSingleton getInstance(){
       if(laze == null){
           synchronized (LazeSingleton.class){
               if(laze == null){
                   laze = new LazeSingleton();
              }
          }
      }
       return laze;
  }
}
  • 缺点:可以被反射破坏。

三、静态内部类

public class StaticInnerSingleton {
  private StaticInnerSingleton(){
?
  }
  public static StaticInnerSingleton getInstance(){
      return InnerSingleton.STATIC_INNER_SINGLETON;
  }
?
  public static class InnerSingleton{
      private final static StaticInnerSingleton STATIC_INNER_SINGLETON = new StaticInnerSingleton();
  }
}

四、Enum类

Enum类不可以被反射破坏

public enum EnumSingleton {
   Instance;
   public EnumSingleton getInstance(){
       return Instance;
  }
}