You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

请问这种隐藏内部类、仅暴露公共API的设计模式叫什么?

模块模式(Module Pattern)—— 闭包驱动的封装方案

嗨,你用的这个设计模式叫做模块模式(Module Pattern),更准确地说,是结合了工厂函数的模块模式,它的核心是利用JavaScript的闭包特性来实现封装,完美契合你想要隐藏内部实现、只暴露公共API的需求。

核心特点和优势:

  • 隐藏内部细节:你的Speach类完全被闭包包裹,终端用户无法直接访问、修改甚至实例化它,从根源上避免了内部实现被篡改的风险。
  • 稳定的公共API:你只对外暴露speach()工厂函数,它返回的对象只包含你指定的公共方法——这些方法代理到内部的Speach实例,但用户感知不到内部的类结构。只要这个公共API的签名和行为不变,你可以随意重构Speach类的内部逻辑,比如修改loadAPI的实现、调整voice的处理流程,都不会影响现有用户的代码。
  • 遵循最小暴露原则:只把必要的功能暴露给外部,减少了API的复杂度,也降低了用户误用内部细节的概率。

结合你的代码框架,典型的实现示例:

// 私有内部类,外部无法访问
class Speach {
  constructor() {
    // 内部初始化逻辑
  }
  browserSupportsFeature() {
    // 内部检测逻辑
  }
  loadAPI() {
    // 内部加载逻辑(可以选择不暴露给外部)
  }
  voice(name) {
    // 内部语音设置逻辑
  }
  speak(text) {
    // 内部语音合成逻辑
  }
}

// 唯一对外暴露的工厂函数
function speach() {
  const internalSpeachInstance = new Speach();
  
  // 只返回需要对外公开的API方法
  return {
    browserSupportsFeature: () => internalSpeachInstance.browserSupportsFeature(),
    voice: (name) => internalSpeachInstance.voice(name),
    speak: (text) => internalSpeachInstance.speak(text)
    // 比如loadAPI这类内部方法就可以不暴露
  };
}

额外补充:

在ES6模块普及之后,你也可以通过模块的私有导出(比如用#私有字段,或者只导出speach函数)来实现类似的封装,但你现在的写法是传统模块模式的经典实现,在任何支持闭包的JavaScript环境中都能稳定工作,兼容性很强。

内容的提问来源于stack exchange,提问作者Eric Andrew Lewis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:29:50