单例模式
2020/8/21 设计模式
在看《剑指 Offer》的时候,看到单例模式的写法,以前只知道设计模式里有单例模式,但是它的写法,作用都不太了解,今天看到了,所以整理一下。
# 1、什么是单例模式
在维基百科上查到,
单例模式,是一种常用的软件设计模式,属于创建型模式的一种。在应用这个模式时,单例对象的类必须保证只有一个实例存在。
# 2、单例模式的实现思路
实现单例模式的思路是:
- 一个类能返回对象一个引用(永远是同一个)和一个获得该实例的方法(必须是静态方法,通常使用 getInstance 这个名称)
- 当我们调用这个方法时,如果类持有的引用不为空就返回这个引用,如果类保持的引用为空就创建该类的实例并将实例的引用赋予该类保持的引用
- 同时我们还将该类的构造函数定义为私有方法,这样其他处的代码就无法通过调用该类的构造函数来实例化该类的对象,只有通过该类提供的静态方法来得到该类的唯一实例。
# 3、JavaScript 实现
根据上面思路,自己写了一个不太成熟的单例模式的类
'use strict';
class Singleton {
static instance = null;
name;
// 在js里实现无法使用private标识符,
// 所以还是可以通过new Singleton来生成多个实例
// 如果可以用private,就是正规的单例模式了。
#constructor(name) {
this.name = name;
}
static createInstance(name) {
if (this.instance === null) {
this.instance = new Singleton(name);
}
return this.instance;
}
}
const a = Singleton.createInstance('a');
const b = Singleton.createInstance('b');
console.log(a, b); // Singleton {name: "a"},Singleton {name: "a"}
console.log(a === b); // true
- 通过静态属性 instance 来作为判断的标识
- 通过静态方法 createInstance 来生成实例
- 在 ts 里,可以让构造函数 私有,来避免直接 new 来生成实例。
# 4、使用场景
单例模式的特点,就是只维护一个全局实例对象。所以:
- 引用第三方库(多次引用只会使用一个库引用,如 jQuery)
- 弹窗(登录框,信息提升框)
- 购物车 (一个用户只有一个购物车)
- 全局态管理 store (Vuex / Redux)
- 还有自己的工具函数等
在这些场景下,可以使用单例模式