JavaScript 开发中常用的 7 种设计模式可分为创作型、结构型和行为型三类,它们为解决对象创建、组合和交互问题提供了可复用的方案。以下是具体模式及核心要点:
1. 构造函数模式(创作型)2. 原型模式(结构型)3. 模块模式(结构型)- 作用:封装私有和公共成员,避免全局污染,支持信息隐藏。
- 特点:
通过闭包实现私有变量和方法。
返回包含公共接口的对象。
- 示例:function AnimalContainer() { const container = []; function addAnimal(name) { container.push(name); } return { add: addAnimal }; // 仅暴露公共方法}const container = AnimalContainer();container.add("Hen");
- 适用场景:需要管理私有状态的工具库或组件(如购物车、表单验证)。
4. 单例模式(创作型)- 作用:确保全局仅有一个实例,节省资源并统一管理状态。
- 特点:
通过闭包或静态变量控制实例化。
测试时依赖隐藏可能导致问题。
- 示例:function DatabaseConnection() { let instance = null; return { open: function() { if (!instance) instance = "Connected"; return instance; } };}const db = DatabaseConnection();db.open(); // "Connected"
- 适用场景:数据库连接、配置管理器等全局唯一实例需求。
5. 工厂模式(创作型)- 作用:抽象对象创建过程,通过通用接口生成不同类型对象。
- 特点:
解耦对象创建与使用代码。
适合复杂初始化或动态类型选择。
- 示例:function DealerFactory(type, config) { const dealer = Object.create(type); Object.assign(dealer, config); return dealer;}const dealerA = DealerFactory({ title: () => "Dealer A" }, { id: 1 });
- 适用场景:需要灵活创建对象的场景(如 UI 组件、支付处理器)。
6. 观察者模式(行为型)- 作用:定义对象间的一对多依赖,状态变化时自动通知订阅者。
- 特点:
发布-订阅机制,解耦观察者与被观察者。
避免频繁轮询检查状态。
- 示例:function Observer() { this.subscribers = [];}Observer.prototype.subscribe = function(fn) { this.subscribers.push(fn); };Observer.prototype.notify = function(data) { this.subscribers.forEach(fn => fn(data));};
- 适用场景:事件处理、状态管理(如 Redux、Vue 响应式系统)。
7. 命令模式(行为型)设计模式的核心价值- 可维护性:通过标准化解决方案减少代码冗余。
- 可扩展性:模式提供灵活的架构,适应需求变化。
- 可测试性:明确职责分离简化单元测试(单例模式除外)。
开发者应根据具体问题选择模式,避免过度设计。例如,简单对象创建可直接用字面量或构造函数,而复杂状态管理适合观察者模式。理解模式本质而非机械套用,才能发挥其最大价值。