为了巩固跟复习22个设计模式,每天不定时发表一篇关于设计模式的文稿!今天写的是结构型模式中的“单例模式(单体模式)”。
创建型模式:单例模式(单件模式)->
- 定义
单例模式是一种创建型设计模式, 让你能够保证一个类只有一个实例, 并提供一个访问该实例的全局节点。
- 单例模式结构
- 单例 (Singleton) 类声明了一个名为 getInstance获取实例的静态方法来返回其所属类的一个相同实例。单例的构造函数必须对客户端 (Client) 代码隐藏。 调用 获取实例方法必须是获取单例对象的唯一方式。
- 适应场景
- 如果程序中的某个类对于所有客户端只有一个可用的实例, 可以使用单例模式。
- 如果你需要更加严格地控制全局变量, 可以使用单例模式。
- 实现方式
- 在类中添加一个私有静态成员变量用于保存单例实例。
- 声明一个公有静态构建方法用于获取单例实例。
- 在静态方法中实现"延迟初始化"。 该方法会在首次被调用时创建一个新对象, 并将其存储在静态成员变量中。 此后该方法每次被调用时都返回该实例。
- 将类的构造函数设为私有。 类的静态方法仍能调用构造函数, 但是其他对象不能调用。
- 检查客户端代码, 将对单例的构造函数的调用替换为对其静态构建方法的调用。
- 单例模式的优缺点
优点:1)你可以保证一个类只有一个实例。
2)你获得了一个指向该实例的全局访问节点。
3)仅在首次请求单例对象时对其进行初始化。
缺点:1)违反了单一职责原则。改模式同时解决了两个问题。
2)单例模式可能掩盖不良设计,比如程序各组件之间相互了解过多等。
3)该模式在多线程环境下需要进行特殊处理,避免多线程多次创建单例对象。
4)单例的客户端代码单元测试可能比较困难,因为许多测试框架以基于继承的方式创建模拟对象,而且绝大部分原因无法重新静态方法,所以你需要相处仔细考虑模拟单例的方法。要么干脆不编写测试代码,或者不使用单例模式。
- 在Java中单例模式的应用
* java.lang.Runtime#getRuntime()* java.awt.Desktop#getDesktop()* java.lang.System#getSecurityManager()
- 如何识别一个单例模式
单例可以通过返回相同的换从对象的静态构建方法来识别