JavaScript 中的设计模式及 Node.js 示例
设计模式是针对典型开发任务的经过验证的解决方案。在 JavaScript 中,尤其是在 Node.js 环境下,它们有助于创建可扩展、可维护且可重用的代码。在本文中,我们将通过实际示例分析四种主要模式:Singleton、Factory、Observer 和 Module。
1. 单例模式 (Singleton)
Singleton 确保一个类只有一个实例,并提供一个全局访问点。在 Node.js 中,这通常用于数据库连接或应用程序配置。
在 Node.js 中实现 Singleton
class Database { constructor() { if (Database.instance) { return Database.instance; } this.connection = null; Database.instance = this; }
async connect(uri) { // 模拟数据库连接 this.connection = `Connected to ${uri}`; console.log(this.connection); }
getConnection() { return this.connection; }}
// 使用const db1 = new Database();const db2 = new Database();
console.log(db1 === db2); // true
db1.connect('mongodb://localhost:27017/myapp');console.log(db2.getConnection()); // "Connected to mongodb://localhost:27017/myapp"何时使用: 管理连接池、全局日志记录器、缓存系统。
2. 工厂模式 (Factory)
Factory 允许在不指定具体类的情况下创建对象。它集中了对象创建逻辑,简化了代码维护。
为验证器实现 Factory
class EmailValidator { validate(value) { return /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(value); }}
class PhoneValidator { validate(value) { return /^\\+?[\\d\\s\\-()]{7,15}$/.test(value); }}
class ValidatorFactory { createValidator(type) { switch (type) { case 'email': return new EmailValidator(); case 'phone': return new PhoneValidator(); default: throw new Error('Unknown validator type'); } }}
// 使用const factory = new ValidatorFactory();const emailValidator = factory.createValidator('email');
console.log(emailValidator.validate('test@example.com')); // trueconsole.log(emailValidator.validate('invalid')); // false何时使用: 创建复杂对象、处理不同数据格式(JSON、XML、YAML)、生成 UI 组件。
3. 观察者模式 (Observer)
Observer 创建了一种订阅机制,允许一个对象(观察者)监视另一个对象(主题)的变化。在 Node.js 中,这种模式通过 EventEmitter 类内置实现。
使用 EventEmitter 实现 Observer
const EventEmitter = require('events');
class NewsPublisher extends EventEmitter { publishArticle(title) { console.log(`📰 文章已发布: ${title}`); this.emit('article', { title, date: new Date() }); }}
class Subscriber { constructor(name) { this.name = name; }
receiveArticle(article) { console.log(`🔔 ${this.name} 收到: "${article.title}"`); }}
// 使用const publisher = new NewsPublisher();const subscriber1 = new Subscriber('Anna');const subscriber2 = new Subscriber('Ivan');
publisher.on('article', (data) => subscriber1.receiveArticle(data));publisher.on('article', (data) => subscriber2.receiveArticle(data));
publisher.publishArticle('JavaScript 中的设计模式');// 输出:// 📰 文章已发布: JavaScript 中的设计模式// 🔔 Anna 收到: "JavaScript 中的设计模式"// 🔔 Ivan 收到: "JavaScript 中的设计模式"何时使用