JavaScript设计模式:Node.js示例

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

JavaScript 中的设计模式及 Node.js 示例



设计模式是针对典型开发任务的经过验证的解决方案。在 JavaScript 中,尤其是在 Node.js 环境下,它们有助于创建可扩展、可维护且可重用的代码。在本文中,我们将通过实际示例分析四种主要模式:SingletonFactoryObserverModule



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 中的设计模式"


何时使用

博客

书籍推荐