Modèles de conception en JavaScript avec des exemples pour Node.js
Les modèles de conception sont des solutions éprouvées aux problèmes de développement typiques. En JavaScript, en particulier dans l'environnement Node.js, ils aident à créer un code évolutif, maintenable et réutilisable. Dans cet article, nous allons examiner quatre modèles principaux : Singleton, Factory, Observer et Module, avec des exemples pratiques.
1. Modèle Singleton
Singleton garantit qu'une classe n'a qu'une seule instance et fournit un point d'accès global à celle-ci. Dans Node.js, cela est souvent utilisé pour la connexion à une base de données ou la configuration de l'application.
Implémentation de Singleton dans Node.js
class Database { constructor() { if (Database.instance) { return Database.instance; } this.connection = null; Database.instance = this; }
async connect(uri) { // Simulation de connexion à la base de données this.connection = `Connected to ${uri}`; console.log(this.connection); }
getConnection() { return this.connection; }}
// Utilisationconst 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"Quand l'utiliser : Gestion d'un pool de connexions, journalisation globale, systèmes de cache.
2. Modèle Factory
Factory permet de créer des objets sans spécifier la classe concrète. Il centralise la logique de création d'objets, simplifiant la maintenance du code.
Implémentation de Factory pour des validateurs
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'); } }}
// Utilisationconst factory = new ValidatorFactory();const emailValidator = factory.createValidator('email');
console.log(emailValidator.validate('test@example.com')); // trueconsole.log(emailValidator.validate('invalid')); // falseQuand l'utiliser : Création d'objets complexes, travail avec différents formats de données (JSON, XML, YAML), génération de composants d'interface utilisateur.
3. Modèle Observer
Observer crée un mécanisme d'abonnement, permettant à certains objets (observateurs) de surveiller les changements dans un autre objet (sujet). Dans Node.js, ce modèle est intégré via la classe EventEmitter.
Implémentation d'Observer avec EventEmitter
const EventEmitter = require('events');
class NewsPublisher extends EventEmitter { publishArticle(title) { console.log(`📰 Article publié : ${title}`); this.emit('article', { title, date: new Date() }); }}
class Subscriber { constructor(name) { this.name = name; }
receiveArticle(article) { console.log(`🔔 ${this.name} a reçu : "${article.title}"`); }}
// Utilisationconst 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('Modèles de conception en JavaScript');// Sortie :// 📰 Article publié : Modèles de conception en JavaScript// 🔔 Anna a reçu : "Modèles de conception en JavaScript"// 🔔 Ivan a reçu : "Modèles de conception en JavaScript"Quand l'utiliser