Middle
Indica i pattern che appartengono a quelli creazionali.
sobes.tech AI
Risposta dell'AI
- Metodo Factory (Factory Method): Definisce un'interfaccia per creare oggetti, ma permette alle sottoclassi di decidere quale classe istanziare.
// Interfaccia della fabbrica class Creator { factoryMethod() { throw new Error("Metodo da implementare nelle sottoclassi"); } anOperation() { const product = this.factoryMethod(); return `Creatore: stessa logica, ${product.operation()}`; } } // ConcreteCreatorA che crea ProductA class ConcreteCreatorA extends Creator { factoryMethod() { return new ConcreteProductA(); } } // Interfaccia del prodotto class Product { operation() { throw new Error("Metodo da implementare nelle sottoclassi"); } } // ConcreteProductA class ConcreteProductA extends Product { operation() { return "Risultato ConcreteProductA"; } } // Uso const creator = new ConcreteCreatorA(); console.log(creator.anOperation()); - Fattoria Astratta (Abstract Factory): Fornisce un'interfaccia per creare famiglie di oggetti correlati o dipendenti, senza specificarne le classi concrete.
// Interfaccia della fabbrica astratta class AbstractFactory { createProductA() { throw new Error("Metodo da implementare nelle sottoclassi"); } createProductB() { throw new Error("Metodo da implementare nelle sottoclassi"); } } // Fattoria concreta per prodotti variante 1 class ConcreteFactory1 extends AbstractFactory { createProductA() { return new ConcreteProductA1(); } createProductB() { return new ConcreteProductB1(); } } // Fattoria concreta per prodotti variante 2 class ConcreteFactory2 extends AbstractFactory { createProductA() { return new ConcreteProductA2(); } createProductB() { return new ConcreteProductB2(); } } // Interfacce dei prodotti class AbstractProductA { operationA() { throw new Error("Metodo da implementare nelle sottoclassi"); } } class AbstractProductB { operationB() { throw new Error("Metodo da implementare nelle sottoclassi"); } anotherOperationB(collaborator) { throw new Error("Metodo da implementare nelle sottoclassi"); } } // ConcreteProductA1 class ConcreteProductA1 extends AbstractProductA { operationA() { return "Risultato ConcreteProductA1"; } } // ConcreteProductB1 class ConcreteProductB1 extends AbstractProductB { operationB() { return "Risultato ConcreteProductB1"; } anotherOperationB(collaborator) { return `Risultato ConcreteProductB1 con ${collaborator.operationA()}`; } } // ConcreteProductA2 class ConcreteProductA2 extends AbstractProductA { operationA() { return "Risultato ConcreteProductA2"; } } // ConcreteProductB2 class ConcreteProductB2 extends AbstractProductB { operationB() { return "Risultato ConcreteProductB2"; } anotherOperationB(collaborator) { return `Risultato ConcreteProductB2 con ${collaborator.operationA()}`; } } // Uso function clientCode(factory) { const productA = factory.createProductA(); const productB = factory.createProductB(); console.log(productB.operationB()); console.log(productB.anotherOperationB(productA)); } console.log('Cliente: Test Factory1...'); clientCode(new ConcreteFactory1()); console.log('Cliente: Test Factory2...'); clientCode(new ConcreteFactory2()); - Builder (Costruttore): Permette di creare oggetti complessi passo dopo passo. Offre la possibilità di usare lo stesso processo di costruzione per ottenere diverse rappresentazioni dell'oggetto.
// Interfaccia builder class Builder { producePartA() { } producePartB() { } producePartC() { } } // Costruttore concreto 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; } } // Ürün class Product1 { constructor() { this.parts = []; } listParts() { console.log(`Ürün parçaları: ${this.parts.join(', ')}`); } } // Yönetici class Director { setBuilder(builder) { this.builder = builder; } buildMinimalViableProduct() { this.builder.producePartA(); } buildFullFeaturedProduct() { this.builder.producePartA(); this.builder.producePartB(); this.builder.producePartC(); } } // Kullanım const director = new Director(); const builder = new ConcreteBuilder1(); director.setBuilder(builder); console.log('Standart minimal ürün:'); director.buildMinimalViableProduct(); builder.getProduct().listParts(); console.log('Standart tam özellikli ürün:'); director.buildFullFeaturedProduct(); builder.getProduct().listParts(); console.log('Kullanıcı tanımlı ürün:'); builder.producePartA(); builder.producePartC(); builder.getProduct().listParts(); - Prototip (Prototype): Mevcut nesneleri kopyalamanıza olanak tanır, detaylarına girmeden.
// Prototip arayüzü class Prototype { clone() { throw new Error("Alt sınıflar tarafından uygulanmalıdır"); } } // ConcretePrototype class ConcretePrototype1 extends Prototype { constructor(property) { super(); this.property = property; } clone() { const clone = new ConcretePrototype1(this.property); // Diğer özelliklerin derin kopyası eklenebilir return clone; } } // Kullanım const original = new ConcretePrototype1("değer"); const clone = original.clone(); console.log(`Orijinal property: ${original.property}`); console.log(`Klon property: ${clone.property}`); console.log(`Farklı nesneler mi? ${original !== clone}`); - Singleton (Tekil): Bir sınıfın yalnızca bir örneği olmasını garanti eder ve ona küresel erişim sağlar.
class Singleton { static instance; constructor() { if (Singleton.instance) { return Singleton.instance; } Singleton.instance = this; } someBusinessLogic() { // ... } } // Kullanım const s1 = new Singleton(); const s2 = new Singleton(); console.log(`Aynı örnekler mi? ${s1 === s2}`);