创建型 简单
单例模式
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