单例模式是一种创建型设计模式, 让你能够保证一个类只有一个实例, 并提供一个访问该实例的全局节点。

image.png

:::info 单例模式的定义是,保证一个类仅有一个实例,并提供一个访问它的全局访问点。 有一些对象,比如线程池/全局缓存/浏览器中的 window 对象等等,我们只需要一个实例。 :::

  • 浏览器中的 window 和 document 全局变量,这两个对象都是单例,任何时候访问他们都是一样的对象,window 表示包含 DOM 文档的窗口,document 是窗口中载入的 DOM 文档,分别提供了各自相关的方法。
  • 在 ES6 新增语法的 Module 模块特性,通过 import/export 导出模块中的变量是单例的,也就是说,如果在某个地方改变了模块内部变量的值,别的地方再引用的这个值是改变之后的。、
  • 项目中的全局状态管理模式 Vuex 维护的全局状态,vue-router维护的路由实例,在单页应用的单页面中都属于单例的应用(但不属于单例模式的应用)。

方案

  • 将默认构造函数设为私有, 防止其他对象使用单例类的 new运算符。
  • 新建一个静态构建方法作为构造函数。 该函数会 “偷偷” 调用私有构造函数来创建对象, 并将其保存在一个静态成员变量中。 此后所有对于该函数的调用都将返回这一缓存对象。

如果你的代码能够访问单例类, 那它就能调用单例类的静态方法。 无论何时调用该方法, 它总是会返回相同的对象。

例子

JavaScript

  1. /**
  2. * 类包含一个方法,这个方法在没有对象存在的情况下,将会创建一个新的实例对象。如果对象存在,这个方法只是返回这个对象的引用。
  3. * */
  4. class Person{
  5. constructor(){
  6. this.user = '张三';
  7. this.token = '';
  8. }
  9. static getInstance(){
  10. if(!this._instance){
  11. this._instance = new Person();
  12. }
  13. return this._instance;
  14. }
  15. }
  16. export default Person.getInstance();