Middle
Nommez les modèles qui appartiennent à la catégorie de création.
sobes.tech IA
Réponse de l'IA
- Méthode de Fabrique (Factory Method): Définit une interface pour créer des objets, mais permet aux sous-classes de décider quelle classe instancier.
// Interface de la fabrique class Creator { factoryMethod() { throw new Error("La méthode doit être implémentée par les sous-classes"); } anOperation() { const product = this.factoryMethod(); return `Creator: la même logique qui vient de travailler avec ${product.operation()}`; } } // Fabrique concrète créant ProductA class ConcreteCreatorA extends Creator { factoryMethod() { return new ConcreteProductA(); } } // Interface du produit class Product { operation() { throw new Error("La méthode doit être implémentée par les sous-classes"); } } // Produit concret créé par ConcreteCreatorA class ConcreteProductA extends Product { operation() { return "Résultat de ConcreteProductA"; } } // Utilisation const creator = new ConcreteCreatorA(); console.log(creator.anOperation()); - Fournisseur Abstrait (Abstract Factory): Fournit une interface pour créer des familles d'objets liés ou dépendants sans spécifier leurs classes concrètes.
// Interface de la fabrique abstraite class AbstractFactory { createProductA() { throw new Error("La méthode doit être implémentée par les sous-classes"); } createProductB() { throw new Error("La méthode doit être implémentée par les sous-classes"); } } // Fábrica concrète pour créer des produits Option 1 class ConcreteFactory1 extends AbstractFactory { createProductA() { return new ConcreteProductA1(); } createProductB() { return new ConcreteProductB1(); } } // Fábrica concreta pour créer des produits Option 2 class ConcreteFactory2 extends AbstractFactory { createProductA() { return new ConcreteProductA2(); } createProductB() { return new ConcreteProductB2(); } } // Interfaces des produits class AbstractProductA { operationA() { throw new Error("La méthode doit être implémentée par les sous-classes"); } } class AbstractProductB { operationB() { throw new Error("La méthode doit être implémentée par les sous-classes"); } anotherOperationB(collaborator) { throw new Error("La méthode doit être implémentée par les sous-classes"); } } // Produits concrets Option 1 class ConcreteProductA1 extends AbstractProductA { operationA() { return "Résultat de ConcreteProductA1"; } } class ConcreteProductB1 extends AbstractProductB { operationB() { return "Résultat de ConcreteProductB1"; } anotherOperationB(collaborator) { return `Résultat de ConcreteProductB1 avec ${collaborator.operationA()}`; } } // Produits concrets Option 2 class ConcreteProductA2 extends AbstractProductA { operationA() { return "Résultat de ConcreteProductA2"; } } class ConcreteProductB2 extends AbstractProductB { operationB() { return "Résultat de ConcreteProductB2"; } anotherOperationB(collaborator) { return `Résultat de ConcreteProductB2 avec ${collaborator.operationA()}`; } } // Utilisation function clientCode(factory) { const productA = factory.createProductA(); const productB = factory.createProductB(); console.log(productB.operationB()); console.log(productB.anotherOperationB(productA)); } console.log('Client: Test de Factory1...'); clientCode(new ConcreteFactory1()); console.log('Client: Test de Factory2...'); clientCode(new ConcreteFactory2()); - Constructeur (Builder): Permet de créer des objets complexes étape par étape. Donne la possibilité d'utiliser un processus de construction uniforme pour obtenir différentes représentations de l'objet.
// Interface du constructeur class Builder { producePartA() { } producePartB() { } producePartC() { } } // Constructeur concret class ConcreteBuilder1 extends Builder { constructor() { super(); this.reset(); } reset() { this.product = new Product1(); } producePartA() { this.product.parts.push('PartA1'); } producePartB() { this.product.parts.push('PartB1'); } producePartC() { this.product.parts.push('PartC1'); } getProduct() { const result = this.product; this.reset(); return result; } } // Producto representado class Product1 { constructor() { this.parts = []; } listParts() { console.log(`Partes del producto: ${this.parts.join(', ')}`); } } // Director (gestor del proceso de construcción) class Director { setBuilder(builder) { this.builder = builder; } buildMinimalViableProduct() { this.builder.producePartA(); } buildFullFeaturedProduct() { this.builder.producePartA(); this.builder.producePartB(); this.builder.producePartC(); } } // Uso const director = new Director(); const builder = new ConcreteBuilder1(); director.setBuilder(builder); console.log('Producto mínimo estándar:'); director.buildMinimalViableProduct(); builder.getProduct().listParts(); console.log('Producto completo estándar:'); director.buildFullFeaturedProduct(); builder.getProduct().listParts(); console.log('Producto personalizado:'); builder.producePartA(); builder.producePartC(); builder.getProduct().listParts(); - Prototipo (Prototype): Permite copiar objetos existentes sin entrar en detalles de su implementación.
// Interfaz del prototipo class Prototype { clone() { throw new Error("El método debe ser implementado por las subclases"); } } // Prototipo concreto class ConcretePrototype1 extends Prototype { constructor(property) { super(); this.property = property; } clone() { const clone = new ConcretePrototype1(this.property); // Se puede agregar copia profunda de otras propiedades si es necesario return clone; } } // Uso const original = new ConcretePrototype1("valor"); const clone = original.clone(); console.log(`Propiedad del original: ${original.property}`); console.log(`Propiedad del clon: ${clone.property}`); // Verificación de que son objetos diferentes console.log(`¿Son objetos iguales? ${original === clone}`); - Singleton (Opción Única): Garantiza que una clase tenga solo una instancia y proporciona un punto de acceso global a ella.
class Singleton { static instance; constructor() { if (Singleton.instance) { return Singleton.instance; } Singleton.instance = this; } someBusinessLogic() { // ... } } // Uso const s1 = new Singleton(); const s2 = new Singleton(); console.log(`¿Son la misma instancia? ${s1 === s2}`);