请问这种隐藏内部类、仅暴露公共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
相关产品推荐
相关产品推荐

