在JavaScript项目规模不断扩大的过程中,代码的组织方式直接影响后续的维护效率。设计模式是前人总结的、可复用的代码设计经验,合理运用能够让我们的应用架构更稳健,降低后续迭代的成本。

什么是JavaScript设计模式
设计模式是针对特定场景下常见问题的通用解决方案,它不是具体的代码,而是一种设计思路。在JavaScript中,设计模式可以帮助我们解决代码耦合、逻辑分散、复用困难等问题,让代码结构更符合单一职责、开闭原则等设计理念。
常用JavaScript设计模式及实践
单例模式
单例模式确保一个类只有一个实例,并且提供一个全局访问点。适合用来管理全局状态、配置对象等场景,避免重复创建实例带来的资源浪费。
// 单例模式实现示例
class ConfigManager {
constructor() {
if (ConfigManager.instance) {
return ConfigManager.instance;
}
this.config = {};
ConfigManager.instance = this;
}
setConfig(key, value) {
this.config[key] = value;
}
getConfig(key) {
return this.config[key];
}
}
// 测试单例效果
const config1 = new ConfigManager();
const config2 = new ConfigManager();
config1.setConfig('apiUrl', 'https://api.ipipp.com');
console.log(config2.getConfig('apiUrl')); // 输出 https://api.ipipp.com
console.log(config1 === config2); // 输出 true
观察者模式
观察者模式定义了对象间的一对多依赖关系,当一个对象状态发生改变时,所有依赖它的对象都会收到通知并自动更新。适合用来处理事件监听、状态同步等场景,降低模块间的直接耦合。
// 观察者模式实现示例
class EventEmitter {
constructor() {
this.events = {};
}
// 订阅事件
on(eventName, callback) {
if (!this.events[eventName]) {
this.events[eventName] = [];
}
this.events[eventName].push(callback);
}
// 触发事件
emit(eventName, ...args) {
const callbacks = this.events[eventName];
if (callbacks) {
callbacks.forEach(callback => callback(...args));
}
}
// 取消订阅
off(eventName, callback) {
const callbacks = this.events[eventName];
if (callbacks) {
this.events[eventName] = callbacks.filter(cb => cb !== callback);
}
}
}
// 使用示例
const emitter = new EventEmitter();
const handleData = (data) => {
console.log('收到数据:', data);
};
emitter.on('dataUpdate', handleData);
emitter.emit('dataUpdate', { id: 1, name: '测试数据' }); // 输出 收到数据: { id: 1, name: '测试数据' }
emitter.off('dataUpdate', handleData);
emitter.emit('dataUpdate', { id: 2 }); // 无输出
工厂模式
工厂模式通过一个工厂函数封装对象的创建逻辑,调用者不需要关心对象的具体创建过程,只需要传入对应参数即可获取实例。适合用来创建多种类型相似的对象,提升代码的扩展性。
// 工厂模式实现示例
class ProductA {
constructor(name) {
this.name = name;
this.type = 'A';
}
getInfo() {
return `产品A: ${this.name}`;
}
}
class ProductB {
constructor(name) {
this.name = name;
this.type = 'B';
}
getInfo() {
return `产品B: ${this.name}`;
}
}
function productFactory(type, name) {
switch (type) {
case 'A':
return new ProductA(name);
case 'B':
return new ProductB(name);
default:
throw new Error('不支持的产品类型');
}
}
// 使用示例
const product1 = productFactory('A', '商品1');
const product2 = productFactory('B', '商品2');
console.log(product1.getInfo()); // 输出 产品A: 商品1
console.log(product2.getInfo()); // 输出 产品B: 商品2
设计模式使用的注意事项
设计模式不是越多越好,需要根据实际场景选择。如果项目规模很小,强行使用复杂的设计模式反而会增加代码的理解成本。同时要避免为了用设计模式而用设计模式,优先保证代码的简洁性和可读性,再考虑通过设计模式优化架构。
另外,不同的设计模式可以组合使用,比如单例模式可以和工厂模式结合,创建全局唯一的工厂实例,管理所有对象的创建逻辑,进一步提升架构的维护性。
JavaScript设计模式可维护应用架构代码复用修改时间:2026-07-08 04:33:24