单例模式:JavaScript世界里的「独生子女政策」

大家好,我是前端老司机,今天要聊的是设计模式里的「独生子女政策」------单例模式。这可不是什么编程玄学,而是让代码更高效、更优雅的实用技巧。

单例模式是个啥?

简单来说,单例模式就是:一个类被new多次,得到的实例对象居然是同一个! 就像世界上只有一个你,不管怎么呼唤,站在你面前的永远是同一个人。

在前端开发中,这玩意儿可太有用了。比如全局状态管理、弹窗组件、WebSocket连接池...这些场景都需要确保对象的唯一性。

JavaScript实现单例模式的两种姿势

姿势一:静态方法版

javascript:d:\shensuo_-ai_fullstack\设计模式\单例模式\3.js 复制代码
class SingleDog {
  show() {
    console.log('我是一个单身狗')
  }
  static getInstance() {
    if (!SingleDog.instance) {
      SingleDog.instance = new SingleDog()
    }
    return SingleDog.instance
  }
}

const s1 = SingleDog.getInstance()
const s2 = SingleDog.getInstance()

console.log(s1 === s2) // true

这就像去领结婚证,第一次去登记处会给你办一本(创建实例),以后再去就直接把那本给你(返回已有实例),保证你永远只有一本合法证书。

姿势二:闭包版

javascript:d:\shensuo_-ai_fullstack\设计模式\单例模式\4.js 复制代码
class SingleDog {
  show() {
    console.log('我是一个单身狗')
  }
}
SingleDog.getInstance = (function() {
  let instance = null
  return function() {
    if (!instance) {
      instance = new SingleDog()
    }
    return instance
  }
})()

const s1 = SingleDog.getInstance()
const s2 = SingleDog.getInstance()

console.log(s1 === s2) // true

这种方式用了JavaScript的「闭包魔法」,把实例对象藏在一个私密空间里,外界无法直接访问,只能通过getInstance方法来获取。就像你把私房钱藏在只有自己知道的地方,别人拿不走也看不到。

从构造函数到ES6 Class

说到类,咱们得先区分一下JavaScript中类的两种写法。在ES6之前,我们用构造函数模拟类:

javascript:d:\shensuo_-ai_fullstack\设计模式\单例模式\1.js 复制代码
function Point(x, y) {
  this.x = x
  this.y = y
}
Point.prototype.toString = function() {
  return `(${this.x}, ${this.y})`
}

而ES6之后,我们有了更优雅的class语法:

javascript:d:\shensuo_-ai_fullstack\设计模式\单例模式\2.js 复制代码
class Point {
  constructor(x, y) {
    this.x = x
    this.y = y
  }
  toString() {
    return `(${this.x}, ${this.y})`
  }
}

就像从手写情书到用微信发消息,本质没变,但体验好多了!

单例模式的「超能力」

  1. 节约资源:只创建一个实例,避免重复创建对象带来的性能开销
  2. 全局访问:通过统一入口访问对象,避免全局变量污染
  3. 状态共享:所有地方使用的都是同一个实例,状态天然同步

比如在Vue项目中,我们常常用单例模式来管理全局状态或API请求实例,确保整个应用使用的是同一套配置和状态。

写在最后

单例模式就像编程世界里的「独生子女政策」,不是所有场景都适用,但在需要对象唯一性的场景下,它绝对是你的「最佳拍档」。

下次写代码时,如果遇到需要确保对象唯一性的场景,不妨试试单例模式,让你的代码更高效、更优雅!

你在项目中用过单例模式吗?欢迎在评论区分享你的使用经验~

相关推荐
刀法如飞7 小时前
开箱即用的 DDD(领域驱动设计)工程脚手架,基于 Spring Boot 4.0.1 和 Java 21
java·spring boot·mysql·spring·设计模式·intellij-idea
GISer_Jing11 小时前
AI Agent 人类参与HITL与知识检索RAG
人工智能·设计模式·aigc
Tiny_React16 小时前
Claude Code Skills 自优化架构设计
人工智能·设计模式
胖虎119 小时前
iOS中的设计模式(十)- 中介者模式(从播放器场景理解中介者模式)
设计模式·中介者模式·解耦·ios中的设计模式
Geoking.19 小时前
【设计模式】组合模式(Composite)详解
java·设计模式·组合模式
刀法孜然19 小时前
23种设计模式 3 行为型模式 之3.6 mediator 中介者模式
设计模式·中介者模式
Yu_Lijing20 小时前
基于C++的《Head First设计模式》笔记——单件模式
c++·笔记·设计模式
Geoking.20 小时前
【设计模式】外观模式(Facade)详解
java·设计模式·外观模式
点云SLAM20 小时前
C++设计模式之单例模式(Singleton)以及相关面试问题
c++·设计模式·面试·c++11·单例模式(singleton)
GISer_Jing1 天前
AI Agent 目标设定与异常处理
人工智能·设计模式·aigc