基础梳理
单件模式(平常习惯叫单例)是一个比较简单的设计模式,也是最为常见的一个模式。
- 定义:确保一个类只有一个实例,并提供一个全局访问点
- 构成:私有的构造器、一个静态方法、一个静态变量
- 确保程序中使用的全局资源只有一份
- 必须是“请求”得到一个实例,而不能自行实例化
应用场景
单例模式一般用于资源共享,有点类似全局变量
场景实例
- 数据库连接池,整个JVM只需要创建一个连接池即可,所有人都只需要从这个连接池getConnection即可,而不需要每个人都去createConnection,避免了因频繁创建、注销而产生的损耗(网络损耗、性能损耗等)
- 线程池。
- 计数器。
注意事项
- 与全局变量区别:全局变量可以提供全局访问,但是不能确保只有一个实例
- 一个系统用到单例的地方还是比较少的,如果用了大量的单例就需要检查设计是否合理了。同理,任何设计模式都不该被滥用。
- 如果有多个类加载器
- 每个类加载器都定义了一个命名空间
- 不同的类加载器可能会加载同一个类
- 可能会导致多个单件并存的怪异现象
代码实例
最简单的实现(非线程安全)
public class Singleton1 {
// 构造方法为private,不允许被外部实例化
private Singleton1() { }
// 静态变量
private static Singleton1 single = null;
// 静态方法
public static Singleton1 getInstance() {
// 如果是第一次,需要先实例化
if (single == null) {
single = new Singleton1();
}
return single;
}
}
最简单的线程安全版本
public class Singleton2 {
// 构造方法为private,不允许被外部实例化
private Singleton2() { }
// 类创建的时候就将对象实例化出来,以后不再改变
private static final Singleton2 single = new Singleton2();
public static Singleton2 getInstance() {
return single;
}
}
这两个实现是学习单例模式的最简单实现,把握住三个点就好了:
- 构造方法私有:不允许被外界实例化,外界只能请求得到实例
- 静态方法:提供实例
- 静态变量:实例,全局唯一
写在最后
学习笔记,如有错误请指正,谢谢~
网友评论