单例模式(Singleton Pattern)

定义

单例模式是一种创建型设计模式,确保一个类​​只有一个实例​​,并提供该实例的​​全局访问点​​。


UML 类图​

设计模式之创建型:单例模式_单例模式

核心特点

  • ​​私有化构造器​​:禁止外部直接创建对象。
  • 静态实例​​:通过静态方法提供唯一实例。
  • 线程安全​​(可选):防止多线程环境下重复创建实例。

优点​

  • 严格控制实例数量​​:确保全局唯一性,避免资源冲突(如配置文件、线程池)。
  • ​​节省资源​​:避免频繁创建销毁对象,提升性能(如数据库连接池)。
  • ​​全局访问点​​:方便其他模块访问统一实例(如日志记录器)。

缺点​​

  • 违反单一职责原则​​:单例类既管理实例创建,又承担业务逻辑。
  • ​​难以扩展​​:因构造器私有化,无法通过继承扩展功能。
  • ​​测试困难​​:全局状态难以隔离,影响单元测试独立性。
  • ​​线程安全问题​​:需额外处理多线程环境下的竞态条件(如未加锁的懒汉式)。

适用场景​

全局唯一资源管理​​

  • 配置管理器(如 ConfigManager)
  • 日志记录器(如 Logger)
  • 应用计数器(如 IDGenerator)

共享资源池​​

  • 线程池(如 ThreadPool)
  • 数据库连接池(如 DatabaseConnectionPool)
  • 缓存系统(如 CacheManager)

​​硬件设备控制​​

  • 打印任务队列(如 PrinterSpooler)
  • 系统时钟(如 SystemClock)

饿汉式

实现起来简单,没有多线程同步问题。空间换时间

public class SingletonDemo {

    private static final SingletonDemo INSTANCE = new SingletonDemo();

    private SingletonDemo() {
    }

    public static SingletonDemo getInstance() {
        return INSTANCE;
    }

    public void otherMethod() {
        System.out.println("执行单例方法");
    }
}

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.

懒汉式(非线程安全)

使用时再进行初始化,非线程安全

public class SingletonDemo {

    private static SingletonDemo INSTANCE;

    private SingletonDemo() {
    }

    public static SingletonDemo getINSTANCE() {
        if (INSTANCE == null) {
            INSTANCE = new SingletonDemo();
        }
        return INSTANCE;
    }

    public void otherMethod() {
        System.out.println("执行单例方法");
    }
}


  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.

懒汉式(双重检查锁,线程安全)

使用时再进行初始化,线程安全

public class SingletonDemo {

    private static volatile SingletonDemo INSTANCE;

    private SingletonDemo() {
    }

    public static SingletonDemo getINSTANCE() {
        if (INSTANCE == null) {
            synchronized (SingletonDemo.class) {
                if (INSTANCE == null) {
                    INSTANCE = new SingletonDemo();
                }
            }
        }
        return INSTANCE;
    }

    public void otherMethod() {
        System.out.println("执行单例方法");
    }
}

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.

静态内部类(线程安全)​

线程安全

public class SingletonDemo {

    private SingletonDemo() {
    }

    private static class SingletonHolder {
        private static final SingletonDemo INSTANCE = new SingletonDemo();
    }

    public static SingletonDemo getINSTANCE() {
        return SingletonHolder.INSTANCE;
    }

    public void otherMethod() {
        System.out.println("执行单例方法");
    }
}

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.