# 单例模式

什么是

单例模式的定义是:保证一个类仅有一个实例,并提供一个访问它的全局访问点。

单例模式是一种常用的模式,有一些对象我们往往只需要一个,比如全局缓存、浏览器中的 window 对象等。

在 JS 开发中,单例模式的用途同样非常广泛。试想一下,当我们单机登录按钮的时候,页面中会出现一个登录浮窗,而这个登录浮窗是唯一的,无论单击多少次登录按钮,这个浮窗都只会被创建一次,那么,这个登录浮窗就适合用单例模式来创建。

# 具体实现

需求

假设要设置一个管理员,多次调用也仅设置一次,我们可以使用闭包缓存一个内部变量来实现这个单例

function SetManager(name) {
  this.manager = name;
}

SetManager.prototype.getName = function () {
  console.log(this.manager);
};

var SingletonSetManager = (function () {
  var manager = null;

  return function (name) {
    if (!manager) {
      manager = new SetManager(name);
    }

    return manager;
  };
})();

SingletonSetManager("a").getName(); // a
SingletonSetManager("b").getName(); // a
SingletonSetManager("c").getName(); // a

注:

这是比较简单的做法,但是假如我们还要设置一个 HR 呢?就得复制一遍代码了

所以,可以改写单例内部,实现更通用一些

// 提取出通用的单例
function getSingleton(fn) {
  var instance = null;

  return function () {
    if (!instance) {
      instance = fn.apply(this, arguments);
    }

    return instance;
  };
}

TIP

再次实践,结果依然一样

// 获取单例
var managerSingleton = getSingleton(function (name) {
  var manager = new SetManager(name);
  return manager;
});

managerSingleton("a").getName(); // a
managerSingleton("b").getName(); // a
managerSingleton("c").getName(); // a

// 这时,我们添加HR时,就不需要更改获取单例内部的实现了
// 仅需要实现添加HR所需要做的,再调用即可。
function SetHr(name) {
  this.hr = name;
}

SetHr.prototype.getName = function () {
  console.log(this.hr);
};

var hrSingleton = getSingleton(function (name) {
  var hr = new SetHr(name);
  return hr;
});

hrSingleton("aa").getName(); // aa
hrSingleton("bb").getName(); // aa
hrSingleton("cc").getName(); // aa
上次更新时间: 6/8/2023, 9:23:17 PM

大厂最新技术学习分享群

大厂最新技术学习分享群

微信扫一扫进群,获取资料

X