Java 中的单例模式:在 Java 应用程序中实现全局访问点
大约 2 分钟
也称为
- 单个实例
单例设计模式的意图
确保 Java 类只有一个实例,并提供一个全局访问点来访问该单例实例。
单例模式的详细说明以及现实世界中的示例
现实世界中的示例
单例模式在现实世界中的类比是政府颁发护照。在一个国家,每个公民在同一时间只能拥有一个有效的护照。护照办公室确保不会向同一个人颁发重复的护照。无论何时公民需要旅行,他们都必须使用这个单一护照,它作为他们旅行凭证的唯一且全球认可的标识符。这种受控访问和唯一实例管理与单例模式如何确保 Java 应用程序中有效地管理对象相呼应。
通俗地说
确保只创建一个特定类的对象。
维基百科说
在软件工程中,单例模式是一种软件设计模式,它限制将一个类实例化为一个对象。这在需要一个对象来协调整个系统中的操作时非常有用。
Java 中单例模式的编程示例
Joshua Bloch,Effective Java 第 2 版,第 18 页
单元素枚举类型是实现单例的最佳方式
public enum EnumIvoryTower {
INSTANCE
}
然后为了使用
var enumIvoryTower1 = EnumIvoryTower.INSTANCE;
var enumIvoryTower2 = EnumIvoryTower.INSTANCE;
LOGGER.info("enumIvoryTower1={}", enumIvoryTower1);
LOGGER.info("enumIvoryTower2={}", enumIvoryTower2);
控制台输出
enumIvoryTower1=com.iluwatar.singleton.EnumIvoryTower@1221555852
enumIvoryTower2=com.iluwatar.singleton.EnumIvoryTower@1221555852
何时在 Java 中使用单例模式
在以下情况下使用单例模式
- 必须存在一个类的唯一实例,并且客户端必须能够从一个众所周知的访问点访问它
- 当唯一实例应通过子类化进行扩展时,客户端应该能够使用扩展的实例而无需修改其代码
Java 中单例模式的现实世界应用
- 日志记录类
- 许多应用程序中的配置类
- 连接池
- 文件管理器
- java.lang.Runtime#getRuntime()
- java.awt.Desktop#getDesktop()
- java.lang.System#getSecurityManager()
单例模式的优缺点
优点
- 对单个实例的受控访问。
- 减少命名空间污染。
- 允许改进操作和表示。
- 允许可变数量的实例(如果需要,可以有多个)。
- 比类操作更灵活。
权衡
- 由于全局状态,难以测试。
- 生命周期管理可能更复杂。
- 如果在没有仔细同步的情况下在并发上下文中使用,可能会导致瓶颈。