简单聊一聊单例设计模式
你是否曾经遇到过需要在应用程序的多个部分共享一个对象的情况,比如数据库连接、WebSocket 客户端或配置管理器或全局的 Logger 对象? 你如何管理这样一个对象,使其在整个应用程序或进程生命周期中保持一致且可访问?这就是单例设计模式发挥作用的地方。 概述 单例是一种创建型设计模式,属于设计模式的一类,用于解决使用new关键字或操作符创建对象的原生方式所带来的不同问题。 单例设计模式主要致力于解决两个主要问题: 我们如何为实例提供一个全局访问点? 我们如何确保一个类或特定类型的对象只有一个实例? 它可以简化并规范我们管理特定种类或类型的全局状态的方式,例如数据库连接、WebSocket 客户端、缓存服务,或者任何我们在整个应用程序生命周期中需要在内存中持久化和修改的内容。 如何实现单例设计模式 class Singleton { private static instance: Singleton private construct() { // 私有构造函数确保只能通过静态方法创建唯一实例 } public static getInstance () { if (!this.instance) { this.instance = new Singleton() } return this.instance } } 该类应该定义一个静态属性来存储唯一可共享的实例。static 关键字意味着实例对象与类的实例无关,而是与类定义本身相关联。类的构造函数应该标记为private 则无法通过 new 创建实例。获取类实例的唯一方法是调用 getInstance 静态方法。 const instance = Singleton.getInstance() 我们可以通过调用与单例类相关联的静态方法getInstance来使用上述类。getInstance 方法保证即使我们在代码库的不同位置多次实例化我们的类,我们始终得到相同的实例。 第一个实际场景 在 node 服务中,需要记录调用接口产生的 log,因此要设计一个全局的 Logger 集中管理日志行为。 class Logger { private static instance: Logger; private logs: string[] = []; private constructor() {} public static getInstance(): Logger { if (!Logger.instance) { Logger.instance = new Logger(); } return Logger.instance; } public log(message: string) { this.logs.push(message); } } // 使用 const logger = Logger.getInstance(); logger.log('Application started'); 在这个例子中,private constructor() 确保: ...