# 单例模式
什么是
单例模式的定义是:保证一个类仅有一个实例,并提供一个访问它的全局访问点。
单例模式是一种常用的模式,有一些对象我们往往只需要一个,比如全局缓存、浏览器中的 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
大厂最新技术学习分享群
微信扫一扫进群,获取资料
X