2020.11.26
概述
单例模式是一种创建型设计模式,让你能够保证一个类只有一个实例,并提供一个访问该实例的全局节点。
解决问题
保证一个类只有一个实例
为什么要控制一个类所拥有的实例数量? 最常见的原因是控制某些共享资源的访问权限。
如果你已经创建了一个对象, 过一会你决定又创建一个对象,此时你会获得之前已创建的对象。
为该实例提供一个全局访问节点
想想平时用来存储重要对象的全局变量,使用上非常方便,但也非常不安全。任何代码都可以覆盖掉变量的内容,从而引发程序崩溃。
和全局变量一样,单例模式也允许程序在任何位置访问特定对象,不同的是还可以保护该实例不被覆盖。
实现
-
在类中添加一个私有静态成员变量保存单例实例。
-
防止其他对象使用单例类的new运算符,将类的构造函数设为私有。
-
声明一个公有静态方法用于获取单例实例。
真实世界类比
一个学校里校长只能有一个,校长位置确定后就不能被随意篡改。
UML
代码
基础单例单线程
Single.java
public final class Singleton {
private static Singleton instance;
public String value;
private Singleton(String value) {
this.value = value;
}
public static Singleton getInstance(String value) {
if (instance == null) {
instance = new Singleton(value);
}
return instance;
}
}
Client.java
public class DemoSingleThread {
public static void main(String[] args) {
System.out.println("If you see the same value, then singleton was reused (yay!)" + "\n" +
"If you see different values, then 2 singletons were created (booo!!)" + "\n\n" +
"RESULT:" + "\n");
Singleton singleton = Singleton.getInstance("马保国");
Singleton anotherSingleton = Singleton.getInstance("婷婷");
System.out.println("混元形意太极掌门人是 " + singleton.value);
System.out.println("混元形意太极掌门人是" + anotherSingleton.value);
}
}
执行结果
If you see the same value, then singleton was reused (yay!)
If you see different values, then 2 singletons were created (booo!!)
RESULT:
混元形意太极掌门人是 马保国
混元形意太极掌门人是 马保国
应用场景
- 程序中的某个类对于所有客户端只有一个可用的实例
- 严格地控制全局变量
优缺点分析
优点
- 保证一个类只有一个实例
- 获得了一个指向该实例的全局访问节点
缺点
- 违反了单一职责原则,该模式同时解决了两个问题