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.log(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进行授权?(权限控制)  ,交易猫的商品怎么发布到网站上去?  深圳防火门网站制作公司,深圳中天明防火门怎么编码?  青岛网站建设如何选择本地服务器?  北京网站制作公司哪家好一点,北京租房网站有哪些?  最好的网站制作公司,网购哪个网站口碑最好,推荐几个?谢谢?