javascript设计模式有哪些_如何实现单例模式
发布时间 - 2025-12-27 00:00:00 点击率:次单例模式确保一个类只有一个实例并提供全局访问点,核心是无论调用多少次都返回同一实例,需通过私有静态变量、私有化构造函数和统一获取方法(如getInstance)实现,支持懒加载或立即创建。
JavaScript 中常用的设计模式包括单例模式、工厂模式、观察者模式(发布-订阅)、策略模式、代理模式、装饰器模式、适配器模式、命令模式、状态模式等。其中,单例模式用于确保一个类只有一个实例,并提供全局访问点。
单例模式的核心要点
单例不是“只能创建一个对象”,而是“无论调用多少次,始终返回同一个实例”。关键在于控制实例的创建时机与唯一性,避免重复初始化。
- 需要一个私有静态变量保存唯一实例
- 构造函数应防止外部直接 new(常通过闭包或 Symbol 隐藏)
- 提供统一的获取实例方法(如 getInstance)
- 支持懒加载(首次调用才创建)或立即创建
基础单例实现(闭包 + 懒加载)
利用立即执行函数(IIFE)封装私有变量,返回带 getInstance 的对象:
const Singleton = (function() {
let instance = null;
function createInstance() {
return {
data: Math.random(),
getName() { return 'Singleton Instance'; }
};
}
return {
getInstance() {
if (!instance) {
instance = createInstance();
}
return instance;
}
};
})();
// 使用
const a = Singleton.getInstance();
const b = Singleton.getInstance();
console.l
og(a === b); // true
ES6 Class 单例写法(推荐)
用 static 属性保存实例,constructor 私有化(通过私有字段或检查机制):
class Logger {
static #instance = null;
constructor() {
if (Logger.#instance) {
throw new Error('Logger is a singleton. Use Logger.getInstance()');
}
this.logs = [];
}
static getInstance() {
if (!Logger.#instance) {
Logger.#instance = new Logger();
}
return Logger.#instance;
}
log(msg) {
this.logs.push(msg);
}
}
// 使用
const logger1 = Logger.getInstance();
const logger2 = Logger.getInstance();
console.log(logger1 === logger2); // true
带参数的单例(可配置但仅初始化一次)
如果需传参初始化(如配置项),应在首次调用 getInstance 时接收,后续忽略:
class Database {
static #instance = null;
static #config = null;
constructor(config) {
if (Database.#instance) {
throw new Error('Database is singleton');
}
this.config = config || Database.#config;
}
static getInstance(config) {
if (!Database.#instance) {
Database.#config = config;
Database.#instance = new Database(config);
}
return Database.#instance;
}
}
注意:这种写法下,config 只在第一次有效;若需动态重置,应额外提供 reset 方法,但会破坏“单例”的语义,慎用。
# javascript
# es6
# java
# 懒加载
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel如何实现多语言支持_Laravel本地化与国际化(i18n)配置教程
如何在腾讯云免费申请建站?
WordPress 子目录安装中正确处理脚本路径的完整指南
HTML5建模怎么导出为FBX格式_FBX格式兼容性及导出步骤【指南】
如何快速生成专业多端适配建站电话?
Laravel怎么进行浏览器测试_Laravel Dusk自动化浏览器测试入门
IOS倒计时设置UIButton标题title的抖动问题
浅谈redis在项目中的应用
网易LOFTER官网链接 老福特网页版登录地址
清除minerd进程的简单方法
BootStrap整体框架之基础布局组件
高性能网站服务器配置指南:安全稳定与高效建站核心方案
Laravel怎么实现搜索高亮功能_Laravel结合Scout与Algolia全文检索【实战】
Laravel怎么实现一对多关联查询_Laravel Eloquent模型关系定义与预加载【实战】
Win11怎么开启自动HDR画质_Windows11显示设置HDR选项
如何在阿里云ECS服务器部署织梦CMS网站?
Linux虚拟化技术教程_KVMQEMU虚拟机安装与调优
Laravel怎么判断请求类型_Laravel Request isMethod用法
零服务器AI建站解决方案:快速部署与云端平台低成本实践
如何用y主机助手快速搭建网站?
如何在云指建站中生成FTP站点?
如何在阿里云高效完成企业建站全流程?
Win11怎样安装网易有道词典_Win11安装词典教程【步骤】
Laravel如何实现事件和监听器?(Event & Listener实战)
Laravel用户认证怎么做_Laravel Breeze脚手架快速实现登录注册功能
大型企业网站制作流程,做网站需要注册公司吗?
大连 网站制作,大连天途有线官网?
Laravel Admin后台管理框架推荐_Laravel快速开发后台工具
怎么制作一个起泡网,水泡粪全漏粪育肥舍冬季氨气超过25ppm,可以有哪些措施降低舍内氨气水平?
如何在IIS中新建站点并解决端口绑定冲突?
进行网站优化必须要坚持的四大原则
如何在建站之星绑定自定义域名?
Microsoft Edge如何解决网页加载问题 Edge浏览器加载问题修复
如何用AI帮你把自己的生活经历写成一个有趣的故事?
惠州网站建设制作推广,惠州市华视达文化传媒有限公司怎么样?
如何自己制作一个网站链接,如何制作一个企业网站,建设网站的基本步骤有哪些?
郑州企业网站制作公司,郑州招聘网站有哪些?
再谈Python中的字符串与字符编码(推荐)
今日头条AI怎样推荐抢票工具_今日头条AI抢票工具推荐算法与筛选【技巧】
英语简历制作免费网站推荐,如何将简历翻译成英文?
家族网站制作贴纸教程视频,用豆子做粘帖画怎么制作?
Laravel如何监控和管理失败的队列任务_Laravel失败任务处理与监控
创业网站制作流程,创业网站可靠吗?
Laravel怎么实现观察者模式Observer_Laravel模型事件监听与解耦开发【指南】
Laravel如何使用Gate和Policy进行授权?(权限控制)
,交易猫的商品怎么发布到网站上去?
深圳防火门网站制作公司,深圳中天明防火门怎么编码?
青岛网站建设如何选择本地服务器?
北京网站制作公司哪家好一点,北京租房网站有哪些?
最好的网站制作公司,网购哪个网站口碑最好,推荐几个?谢谢?


og(a === b); // true