单例模式确保一个类仅有一个实例并提供全局访问点。通过闭包或静态属性实现,如日志器或配置管理器,避免重复创建对象,节约资源并保持状态一致,适用于需唯一对象的场景,但应慎用以降低耦合和副作用风险。

单例模式的核心思想是:在整个应用生命周期中,某个类或对象只被实例化一次,且提供一个全局访问点。这在JavaScript中非常实用,尤其适用于管理共享资源、配置信息、日志记录器等场景。
单例模式确保一个类只有一个实例,并提供一个全局访问方法来获取该实例。它避免了重复创建对象带来的资源浪费,也保证了状态的一致性。
在JavaScript中,由于没有类的严格定义(ES6之前),我们通常通过函数和闭包来实现单例。
利用闭包可以将实例“隐藏”起来,防止外部直接修改,只暴露获取实例的方法。
立即学习“Java免费学习笔记(深入)”;
// 单例构造函数 // 使用立即执行函数保护 instance 变量const Singleton = (function () {
let instance = null;
function Logger() {
this.logs = [];
}
Logger.prototype.log = function (msg) {
this.logs.push(msg);
console.log(`Log: ${msg}`);
};
return {
getInstance: function () {
if (!instance) {
instance = new Logger();
}
return instance;
}
};
})();
上面代码中,instance 被闭包保护,外部无法直接访问或修改。调用 Singleton.getInstance() 时,若实例不存在则创建,否则返回已有实例。
假设你在开发一个前端应用,需要一个全局的日志管理器,多个模块都要记录日志,但你不希望有多个日志对象占用内存或造成数据不一致。
const logger1 = Singleton.getInstance();
const logger2 = Singleton.getInstance();
logger1.log('启动系统');
logger2.log('用户登录');
console.log(logger1 === logger2); // true,同一个实例
你会发现两个变量指向的是同一个对象,日志数组也会累积所有记录,实现了真正的“单例”效果。
现代JavaScript支持class语法,我们可以结合静态属性来实现单例:
class ConfigManager {
static instance = null;
constructor() {
if (ConfigManager.instance) {
return ConfigManager.instance;
}
this.config = {};
ConfigManager.instance = this;
return this;
}
set(key, value) {
this.config[key] = value;
}
get(key) {
return this.config[key];
}
}
使用方式:
const config1 = new ConfigManager();
const config2 = new ConfigManager();
config1.set('apiUrl', 'https://api.example.com');
console.log(config2.get('apiUrl')); // 输出正确值
console.log(config1 === config2); // true
这种写法更清晰,适合现代项目结构,但要注意构造函数中的判断逻辑必须放在前面,防止重复赋值。
单例虽然方便,但也有一些需要注意的地方:
建议只在真正需要全局唯一对象时使用,比如配置中心、数据库连接池、缓存管理器等。
基本上就这些。单例模式在JavaScript中实现简单,用途广泛,关键是理解其背后的思想——控制实例数量,统一访问入口。掌握好这个模式,能让你的代码更加高效和可控。
以上就是JavaScript设计模式之单例模式实战_javascript技巧的详细内容,更多请关注php中文网其它相关文章!
java怎么学习?java怎么入门?java在哪学?java怎么学才快?不用担心,这里为大家提供了java速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号