「这是我参与2022首次更文挑战的第6天,活动详情查看:2022首次更文挑战」。
一、什么是单例模式
单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。
单例模式简单理解就是只有一个实例的模式,就叫单例模式
二、单例模式的作用
当遇到创建对象时耗时过多或耗资源过多,但又经常用到的对象,我们就可以考虑使用单例模式。
例子:假设你有一辆跑车,你张三朋友找你借车,你车刚好闲着,你借给他了,过了一会李四来借车,但是你车已经借给张三了,所以没法借给李四,你的车就是一个实例对象,可以创建一个新的,但是消耗太大,为了借车给别人去买一辆新的,有点没必要对吧,又不是玩具车,所以这就是单例模式,
三、代码实现
class Singleton {
// 定义私有的静态属性,来保存对象实例
static singleton
constructor() {}
// 提供一个静态的方法来获取对象实例
static getInstance() {
if (!Singleton.singleton) {
Singleton.singleton = new Singleton();
}
return Singleton.singleton;
}
}
3.1 代码解析
首先先创建一个类,
再创建一个属性,用来存放实例对象,
然后提供一个静态方法,调用方法自动创建对象实例
3.2 调用方法
let instance1 = Singleton.getInstance();
let instance2 = Singleton.getInstance();
console.log(instance1 === instance2); // true
当你创建两个变量同时调用类中的静态方法,他会返回存放实例对象的静态属性,而类中的静态属性是同一个,所以两个变量会同时指向同一个地址,所以这里的判断为true,
这样就可以实现,无论你创建多少个变量,都只会存在一个实例对象
3.3 创建实例
let instance1 = new Singleton();
let instance2 = new Singleton();
console.log(instance1 === instance2); // false
当然只要有constructor就可以创建实例对象,都可以用new的方式来创建,但这就达不到单例模式的要求,你使用new创建,每一个实例对象都是一个新的实例,所以这里的判断就为false。
四、优缺点
优点:
- 1、在内存里只有一个实例,减少了内存的开销,尤其是频繁的创建和销毁实例(比如管理学院首页页面缓存)。
- 2、避免对资源的多重占用(比如写文件操作)。
缺点: 没有接口,不能继承,与单一职责原则冲突,一个类应该只关心内部逻辑,而不关心外面怎么样来实例化。
五、使用场景
- 1、要求生产唯一序列号。
- 2、WEB 中的计数器,不用每次刷新都在数据库里加一次,用单例先缓存起来。
- 3、创建的一个对象需要消耗的资源过多,比如 I/O 与数据库的连接等。