Entwurfsmuster in JavaScript mit Beispielen für Node.js
Entwurfsmuster sind bewährte Lösungen für typische Entwicklungsaufgaben. In JavaScript, insbesondere in der Node.js-Umgebung, helfen sie dabei, skalierbaren, wartbaren und wiederverwendbaren Code zu erstellen. In diesem Artikel werden wir vier grundlegende Muster behandeln: Singleton, Factory, Observer und Module, mit praktischen Beispielen.
1. Singleton-Muster (Einzelstück)
Singleton stellt sicher, dass eine Klasse nur eine einzige Instanz hat, und bietet einen globalen Zugriffspunkt darauf. In Node.js wird dies häufig für Datenbankverbindungen oder die Anwendungskonfiguration verwendet.
Implementierung von Singleton in Node.js
class Database { constructor() { if (Database.instance) { return Database.instance; } this.connection = null; Database.instance = this; }
async connect(uri) { // Simulation einer Datenbankverbindung this.connection = `Connected to ${uri}`; console.log(this.connection); }
getConnection() { return this.connection; }}
// Verwendungconst 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"Wann verwenden: Verwaltung von Verbindungspools, globaler Logger, Cache-Systeme.
2. Factory-Muster (Fabrik)
Factory ermöglicht die Erstellung von Objekten ohne Angabe einer konkreten Klasse. Es zentralisiert die Logik der Objekterstellung und vereinfacht so die Code-Wartung.
Implementierung einer Factory für Validatoren
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'); } }}
// Verwendungconst factory = new ValidatorFactory();const emailValidator = factory.createValidator('email');
console.log(emailValidator.validate('test@example.com')); // trueconsole.log(emailValidator.validate('invalid')); // falseWann verwenden: Erstellung komplexer Objekte, Arbeit mit verschiedenen Datenformaten (JSON, XML, YAML), Generierung von UI-Komponenten.
3. Observer-Muster (Beobachter)
Observer erstellt einen Abonnement-Mechanismus, der es Objekten (Beobachtern) ermöglicht, Änderungen in einem anderen Objekt (Subjekt) zu verfolgen. In Node.js ist dieses Muster über die Klasse EventEmitter integriert.
Implementierung von Observer mit EventEmitter
const EventEmitter = require('events');
class NewsPublisher extends EventEmitter { publishArticle(title) { console.log(`📰 Artikel veröffentlicht: ${title}`); this.emit('article', { title, date: new Date() }); }}
class Subscriber { constructor(name) { this.name = name; }
receiveArticle(article) { console.log(`🔔 ${this.name} erhielt: "${article.title}"`); }}
// Verwendungconst 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('Entwurfsmuster in JavaScript');// Ausgabe:// 📰 Artikel veröffentlicht: Entwurfsmuster in JavaScript// 🔔 Anna erhielt: "Entwurfsmuster in JavaScript"// 🔔 Ivan erhielt: "Entwurfsmuster in JavaScript"Wann verwenden