单例模式
单例模式是一种创建型设计模式, 让你能够保证一个类只有一个实例, 并提供一个访问该实例的全局节点。
实现步骤
-
在类中添加一个私有静态成员变量用于保存单例实例。
-
声明一个公有静态构建方法用于获取单例实例。
-
在静态方法中实现"延迟初始化"。 该方法会在首次被调用时创建一个新对象, 并将其存储在静态成员变量中。 此后该方法每次被调用时都返回该实例。
-
将类的构造函数设为私有。 类的静态方法仍能调用构造函数, 但是其他对象不能调用。
-
检查客户端代码, 将对单例的构造函数的调用替换为对其静态构建方法的调用。
优缺点
| 优点 | 缺点 |
|---|---|
| 你可以保证一个类只有一个实例 | 违反了单一职责原则。 该模式同时解决了两个问题 |
| 你获得了一个指向该实例的全局访问节点 | 单例模式可能掩盖不良设计, 比如程序各组件之间相互了解过多等 |
| 仅在首次请求单例对象时对其进行初始化 | 该模式在多线程环境下需要进行特殊处理, 避免多个线程多次创建单例对象 |
| --- | 单例的客户端代码单元测试可能会比较困难, 因为许多测试框架以基于继承的方式创建模拟对象。 由于单例类的构造函数是私有的, 而且绝大部分语言无法重写静态方法, 所以你需要想出仔细考虑模拟单例的方法。 要么干脆不编写测试代码, 或者不使用单例模式 |