MST

星途 面试题库

面试题:JavaScript 面向对象编程中的设计模式与类的结合应用

在 JavaScript 面向对象编程中,常见的设计模式如单例模式、工厂模式等。请选择一种设计模式,结合 ES6 的类进行详细实现,并说明在何种业务场景下该设计模式与类结合使用能带来显著优势,同时分析这种结合可能存在的潜在问题及解决方案。
18.8万 热度难度
编程语言JavaScript

知识考点

AI 面试

面试题答案

一键面试

单例模式实现及分析

  1. 单例模式结合 ES6 类的实现
class Singleton {
    constructor() {
        if (Singleton.instance) {
            return Singleton.instance;
        }
        this.data = "这是单例实例的数据";
        Singleton.instance = this;
        return this;
    }
}
// 使用示例
const instance1 = new Singleton();
const instance2 = new Singleton();
console.log(instance1 === instance2); // true
  1. 适用业务场景及优势
    • 场景:在应用程序中,某些资源只需要一个实例来管理,如全局状态管理、数据库连接池等。以全局状态管理为例,应用程序中可能存在一个全局的用户登录状态,无论在哪个模块访问,都应该是同一个状态实例。
    • 优势:避免多次创建相同实例带来的资源浪费,提高资源利用率。同时,确保全局只有一个实例,方便数据的统一管理和维护。在数据库连接池场景下,若每次需要数据库操作都创建新的连接实例,会消耗大量资源,单例模式的连接池实例可以复用连接,提升性能。
  2. 潜在问题及解决方案
    • 问题
      • 全局变量污染:单例模式本质上会创建一个全局可访问的实例,可能会与其他全局变量冲突。
      • 测试困难:由于单例的唯一性,在测试时难以创建多个独立的实例用于不同测试场景。
    • 解决方案
      • 针对全局变量污染:将单例的创建和访问封装在一个模块内,通过 ES6 的模块系统,将单例实例作为模块的导出对象,减少与外部全局变量的冲突。例如,将上述 Singleton 类的定义放在一个单独的 singleton.js 文件中,使用时通过 import 导入。
      • 针对测试困难:在测试框架中,可以通过依赖注入的方式,在测试时传入模拟的单例实例。例如,在测试某个依赖单例的函数时,将模拟的单例实例作为参数传入函数,而不是直接在函数内部获取真实的单例实例。这样可以在不同测试用例中使用不同的模拟实例,便于测试。