单例模式
确保某一个类只有一个实例,而且自行实例化并向整个系统提供整个实例
代码实现
public class Singleton {
//private限定初始化,保证自动初始化且只初始化一个对象
private static final Singleton singleton=new Singleton();
//私有化构造函数,防止创建多个变量
private Singleton() {
}
//提供给外部访问这个对象
public static Singleton getSingleton(){
return singleton;
}
}
//通过get方法获取同一个对象
Singleton singleton=Singleton.getSingleton();
优点
- 单例模式只在内存中创建一份对象,减少内存开支,特别适用于对象频繁创建和销毁
- 可以永久驻留内存,适用于对象产生时比较消耗资源的对象
- 避免对资源的多重占用,防止对同一个资源文件同时修改的操作
缺点
- 单例模式没有接口,拓展比较困难
- 单例模式要写完才能进行单元测试,没有接口也不能使用mock
- 单例模式与单一职责原则有冲突,单例模式考虑的是内存优化,并不是为了实现目标。
使用场景
- 要求生成唯一序列号的环境
- 项目中需要一个共享访问点或共享数据
- 创建对象需要消耗资源过多时
- 需要创建大量工具类常量的时候
拓展,一个类只产生2-3个对象(或固定多个对象):有上限的单例模式
例:一个班只有固定的三个老师,学生随机找老师送教师节礼物,构建一个只有固定三个对象的老师类
public class Teacher {
//最多产生的实例数量
private static final int MAX_TEACHER=3;
//定义一个列表去存放老师的私有属性,比如名字
private static ArrayList<String> namelist=new ArrayList<>();
//定义一个列表去存放老师的对象实例
private static ArrayList<Teacher> teacherList= new ArrayList<>()