Middle
Noem de patronen die tot de creërende behoren.
sobes.tech AI
Antwoord van AI
- Factory Method: Bepaalt de interface voor het creëren van objecten, maar laat subclasses beslissen welke klasse geïnstantieerd wordt.
// Factory interface class Creator { factoryMethod() { throw new Error("De methode moet door subclasses geïmplementeerd worden"); } anOperation() { const product = this.factoryMethod(); return `Creator: dezelfde logica die net werkte met ${product.operation()}`; } } // Concrete factory die ProductA creëert class ConcreteCreatorA extends Creator { factoryMethod() { return new ConcreteProductA(); } } // Product interface class Product { operation() { throw new Error("De methode moet door subclasses geïmplementeerd worden"); } } // Concrete product gemaakt door ConcreteCreatorA class ConcreteProductA extends Product { operation() { return "Resultaat van ConcreteProductA"; } } // Gebruik const creator = new ConcreteCreatorA(); console.log(creator.anOperation()); - Abstract Factory: Biedt een interface voor het creëren van families van gerelateerde of onderling afhankelijke objecten, zonder hun concrete klassen te specificeren.
// Abstract factory interface class AbstractFactory { createProductA() { throw new Error("De methode moet door subclasses geïmplementeerd worden"); } createProductB() { throw new Error("De methode moet door subclasses geïmplementeerd worden"); } } // Concrete factory voor het creëren van Producten Optie 1 class ConcreteFactory1 extends AbstractFactory { createProductA() { return new ConcreteProductA1(); } createProductB() { return new ConcreteProductB1(); } } // Concrete factory voor het creëren van Producten Optie 2 class ConcreteFactory2 extends AbstractFactory { createProductA() { return new ConcreteProductA2(); } createProductB() { return new ConcreteProductB2(); } } // Product interfaces class AbstractProductA { operationA() { throw new Error("De methode moet door subclasses geïmplementeerd worden"); } } class AbstractProductB { operationB() { throw new Error("De methode moet door subclasses geïmplementeerd worden"); } anotherOperationB(collaborator) { throw new Error("De methode moet door subclasses geïmplementeerd worden"); } } // Concrete producten Optie 1 class ConcreteProductA1 extends AbstractProductA { operationA() { return "Resultaat van ConcreteProductA1"; } } class ConcreteProductB1 extends AbstractProductB { operationB() { return "Resultaat van ConcreteProductB1"; } anotherOperationB(collaborator) { return `Resultaat van ConcreteProductB1 samen met ${collaborator.operationA()}`; } } // Concrete producten Optie 2 class ConcreteProductA2 extends AbstractProductA { operationA() { return "Resultaat van ConcreteProductA2"; } } class ConcreteProductB2 extends AbstractProductB { operationB() { return "Resultaat van ConcreteProductB2"; } anotherOperationB(collaborator) { return `Resultaat van ConcreteProductB2 samen met ${collaborator.operationA()}`; } } // Gebruik function clientCode(factory) { const productA = factory.createProductA(); const productB = factory.createProductB(); console.log(productB.operationB()); console.log(productB.anotherOperationB(productA)); } console.log('Client: Testen van Factory1...'); clientCode(new ConcreteFactory1()); console.log('Client: Testen van Factory2...'); clientCode(new ConcreteFactory2()); - Builder: Maakt het mogelijk om complexe objecten stapsgewijs te creëren. Biedt de mogelijkheid om hetzelfde bouwproces te gebruiken voor het verkrijgen van verschillende representaties van het object.
// Builder interface class Builder { producePartA() { } producePartB() { } producePartC() { } } // Concrete builder 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; } } // Het te presenteren product class Product1 { constructor() { this.parts = []; } listParts() { console.log(`Deel onderdelen van het product: ${this.parts.join(', ')}`); } } // Directeur (optioneel, beheert het bouwproces) class Director { setBuilder(builder) { this.builder = builder; } buildMinimalViableProduct() { this.builder.producePartA(); } buildFullFeaturedProduct() { this.builder.producePartA(); this.builder.producePartB(); this.builder.producePartC(); } } // Gebruik const director = new Director(); const builder = new ConcreteBuilder1(); director.setBuilder(builder); console.log('Standaard minimaal product:'); director.buildMinimalViableProduct(); builder.getProduct().listParts(); console.log('Standaard volledig product:'); director.buildFullFeaturedProduct(); builder.getProduct().listParts(); console.log('Gebruikersproduct:'); builder.producePartA(); builder.producePartC(); builder.getProduct().listParts(); - Prototype: Maakt het mogelijk om bestaande objecten te kopiëren zonder in te gaan op de details van hun implementatie.
// Prototype interface class Prototype { clone() { throw new Error("De methode moet door subclasses geïmplementeerd worden"); } } // Concrete prototype class ConcretePrototype1 extends Prototype { constructor(property) { super(); this.property = property; } clone() { const clone = new ConcretePrototype1(this.property); // Diepe kopieën van andere eigenschappen kunnen hier worden toegevoegd indien nodig return clone; } } // Gebruik const original = new ConcretePrototype1("waarde"); const clone = original.clone(); console.log(`Oorsprong property: ${original.property}`); console.log(`Kloon property: ${clone.property}`); // Controleren of het verschillende objecten zijn console.log(`Zijn het dezelfde objecten? ${original === clone}`); - Singleton: Zorgt ervoor dat een klasse slechts één instantie heeft en biedt een globale toegangspunt tot dat object.
class Singleton { static instance; constructor() { if (Singleton.instance) { return Singleton.instance; } Singleton.instance = this; } someBusinessLogic() { // ... } } // Gebruik const s1 = new Singleton(); const s2 = new Singleton(); console.log(`Dezelfde instanties? ${s1 === s2}`);