设计模式-创建型-单例模式(Singleton)
参考文献
- https://java-design-patterns.com/patterns/singleton/
- https://www.oodesign.com/singleton-pattern
- https://refactoringguru.cn/design-patterns/singleton
单例模式
- 保证一个类只有一个实例,并提供一个访问该实例的全局节点.
组件
- 在单例模式中,只有
Singleton
这一个角色. Singleton
角色中有一个返回唯一实例的static
方法.该方法总是返回同一个实例.
实现方式
- 在类中添加一个私有静态成员变量用于保存单例实例.
- 声明一个公有静态构建方法用于获取单例实例.
- 在静态方法中实现"延迟初始化". 该方法会在首次被调用时创建一个新对象, 并将其存储在静态成员变量中. 此后该方法每次被调用时都返回该实例.
- 将类的构造函数设为私有. 类的静态方法仍能调用构造函数, 但是其他对象不能调用.
- 检查客户端代码, 将对单例的构造函数的调用替换为对其静态构建方法的调用.
具体实现
懒汉式
1 | class Singleton { |
双检锁校验(DCL
)
1 | public class LazyDoubleCheckSingleton { |
饿汉式
1 | public class LazySingleton { |
静态内部类
1 | public class StaticInnerClassSingleton { |
枚举
1 | public enum EnumInstance { |
与其他模式的关系
- 外观模式类通常可以转换为单例模式类, 因为在大部分情况下一个外观对象就足够了.
- 如果你能将对象的所有共享状态简化为一个享元对象, 那么享元模式就和单例类似了. 但这两个模式有两个根本性的不同.
- 只会有一个单例实体, 但是享元类可以有多个实体, 各实体的内在状态也可以不同.
- 单例对象可以是可变的. 享元对象是不可变的.
- 抽象工厂模式、 建造者模式和原型模式都可以用单例来实现.
使用场景
Logger Classes
(日志类)
- 单例模式用于日志类的设计.此类通常作为单例实现,并在所有应用程序组件中提供全局日志记录访问点,而无需在每次执行日志记录操作时创建对象.
Configuration Classes
(配置类)
- 单例模式用于设计为应用程序提供配置设置的类.通过将配置类实现为
Singleton
,我们不仅提供了全局访问点,而且还保留了用作缓存对象的实例.当实例化类时(或读取值时),单例会将值保留在其内部结构中.如果从数据库或文件读取值,则可以避免每次使用配置参数时重新加载值.
Accesing resources in shared mode
(以共享模式访问资源)
- 资源管理器
- 连接池/线程池
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 HoleLin's Blog!