创建型 简单

单例模式

Singleton Pattern

确保一个类只有一个实例,并提供一个全局访问点

概述

单例模式是一种创建型设计模式,它确保一个类只有一个实例存在,并提供一个全局访问点来访问这个实例。这种模式在需要控制资源访问、配置管理、日志记录等场景中非常有用。

适用场景

  • 当类只能有一个实例,且客户端需要从众所周知的访问点访问它时
  • 当这个唯一实例应该通过子类化进行扩展,且客户端应该能够使用扩展实例而不需要修改代码时
  • 需要控制共享资源的并发访问时
  • 需要全局配置或状态管理时

优点

  • +保证一个类只有一个实例,节省系统资源
  • +提供对唯一实例的全局访问点
  • +可以延迟实例化(懒加载),提高启动性能
  • +避免对共享资源的重复初始化

缺点

  • 违反单一职责原则,单例类同时负责创建和管理自己的实例
  • 可能隐藏类之间的依赖关系,使代码难以测试
  • 在多线程环境下需要特殊处理(同步)
  • 难以扩展或修改,因为所有客户端都依赖于单例的具体类

结构

classDiagram class Singleton { -Singleton instance -Singleton() +getInstance() Singleton +businessLogic() } class Client { +main() } Client ..> Singleton : uses style Singleton fill:#e3f2fd,stroke:#1976d2,stroke-width:2px style Client fill:#f5f5f5,stroke:#616161,stroke-width:1px

交互演示

观察单例模式如何确保只有一个实例存在
Client 1
Client 2
Client 3
getInstance()
getInstance()
getInstance()
Singleton
1
✓ 唯一实例
null
null
null

点击开始演示,观察三个客户端如何获取同一个实例

生活类比

单例模式就像是现实世界中的某些独特资源或职位

国家主席

一个国家只有一个国家主席,所有公民都通过同一个"访问点"来认识这位主席。无论你在哪里提到"国家主席",指的都是同一个人。

打印机后台处理程序

操作系统中的打印机后台处理程序是单例的。无论有多少个应用程序想要打印,都通过同一个打印队列来管理,避免打印任务混乱。

手机系统设置

手机中的系统设置应用是单例的。无论你从哪个入口打开设置,都是同一个应用实例,确保设置的一致性。

代码实现

Example.java

实际应用

Spring Framework - Bean 容器

Spring 的 ApplicationContext 通常以单例模式管理 Bean,确保每个 Bean 在容器中只有一个实例(默认作用域)。

Example.java

Java Runtime 类

Java 标准库中的 Runtime 类使用单例模式,每个 Java 应用程序只有一个 Runtime 对象。

Example.java

日志记录器

许多日志框架(如 Log4j、SLF4J)使用单例模式管理日志配置和输出。

Example.java

练习

1

单例模式的主要目的是什么?

2

单例模式的构造函数必须是私有的

3

以下哪个不是单例模式的缺点?