发布于 2024 年 2 月 26 日,星期一
Singleton Pattern是一种设计模式,确保一个类只有一个实例,并提供一个全局访问点。在前端开发中,它常用于管理全局状态或资源,如配置、缓存或数据库连接。通过限制实例数量,Singleton Pattern减少了内存占用和资源竞争,提高了代码的可维护性和性能。实现时,通常使用闭包或模块模式来隐藏实例的创建逻辑,确保只有唯一实例存在。这种模式在需要严格控制资源访问和状态管理的场景中尤为重要,帮助开发者编写更优雅、高效的JavaScript代码。
单例模式:保证一个类仅有一个实例,并提供一个访问的全局访问点。
仅有一个实例对象
全局都可访问该实例
实现一个标准的单例模式其实就是用一个变量来表示是否已经为当前类创建过实例化对象,若创建过,在下次获取或创建实例时直接返回之前创建的实例化对象即可
。简单版 单例模式
var CreateStr = function (str) {
this.str = str;
this.instance = null;
};
CreateStr.prototype.getStr = function () {
console.log(this.str);
};
CreateStr.getInstance = function (str) {
if (!this.instance) {
this.instance = new CreateStr(str);
}
return this.instance;
};
var a = CreateStr.getInstance('s1');
var b = CreateStr.getInstance('s2');
console.log('a ------>', a); // CreateStr { name: 's1', instance: null }
console.log('b ------>', b); // CreateStr { name: 's1', instance: null }
a.getStr(); // s1
b.getStr(); // s1
console.log(a === b); // true
透明版 单例模式
var CreateStr = (function () {
var instance = null;
return function (str) {
if (instance) {
return instance;
}
this.str = str;
return (instance = this);
};
})();
CreateStr.prototype.getStr = function () {
console.log(this.str);
};
let a = new CreateStr('s1');
let b = new CreateStr('s2');
console.log('a ------>', a); // { str: 's1' }
console.log('b ------>', b); // { str: 's1' }
a.getStr(); // s1
b.getStr(); // s1
console.log(a === b); // true
代理版 单例模式
function CreateStr(str) {
this.str = str;
this.getStr();
}
CreateStr.prototype.getStr = function () {
console.log(this.str);
};
var ProxyObj = (function () {
var instance = null;
return function (str) {
if (!instance) {
instance = new CreateStr(str);
}
return instance;
};
})();
var a = new ProxyObj('s1');
var b = new ProxyObj('s2');
console.log('a ------>', a); // CreateStr { str: 's1' }
console.log('b ------>', b); // CreateStr { str: 's1' }
a.getStr(); // s1
b.getStr(); // s1
console.log('b ------>', a === b); // true
曾探
大佬的《JavaScript 设计模式与开发实践》。文章仅做个人学习总结和知识汇总