02 Java设计模式学习笔记 - 单例模式

46 阅读1分钟
  • 单例模式
    • 采取一定的方法保证在整个程序运行期间,某个类只存在一个实例对象。
    • 该类提供一个可以获取实例对象的静态方法

1. 饿汉式

public class Singleton1 {

    // 私有的静态对象
    private static final Singleton1 instance = new Singleton1();
    
    // 提供一个静态方法获取实例
    public static Singleton1 getInstance() {
        return instance;
    }

    private Singleton1 () {
        // 私有化构造方法
    }
}
  • 使用静态代码块
    • 利用静态代码块只会随着类加载执行一次

public class Singleton2 {
    
    private static final Singleton2 instance;

    static {
        instance = new Singleton2();
    }

    /// 公共方法
    public static Singleton2 getInstance() {
        return instance;
    }

    private Singleton2 (){}
}

特点:线程安全,可能造成内存浪费

2. 懒汉式

public class Singleton3 {

    private static volatile Singleton3 instance;

    public static Singleton3 getInstance() {

      if (instance == null) {
          synchronized (Singleton3.class) {
              if (instance == null) {
                  instance = new Singleton3();
              }
          }
      }

      return instance;
    }

    private Singleton3() {}
}
  • 使用静态代码块
public class Singleton4 {
    /// 静态内部类
    private static class Singleton {
        private static final Singleton4 INSTANCE = new Singleton4();
    }

    /// 私有构造
    private Singleton4() {

    }

    /// 公共获取方法
    public static  Singleton4 getInstance() {
        return Singleton.INSTANCE;
    }
}

线程安全,延迟加载

  • 枚举使用单例
public enum Singleton5 {
    INSTANCE;
    public void func() {
        System.out.println("调用方法");
    }
}
  • 依赖JVM 的类加载机制来保证线程安全和单例性。
  • 不会有同步和锁的开销,比双重检查效率更高。