Middle
Uveďte vzory, ktoré patria medzi tvorivé.
sobes.tech AI
Odpoveď od AI
- Fabrika metóda (Factory Method): Určuje rozhranie na vytváranie objektov, ale umožňuje podtriedam rozhodnúť, aký typ triedy inštancovať.
// Rozhranie fabriky class Creator { factoryMethod() { throw new Error("Metóda musí byť implementovaná podtriedami"); } anOperation() { const product = this.factoryMethod(); return `Creator: rovnaká logika, ktorá práve pracovala s ${product.operation()}`; } } // Konkrétna fabrika vytvárajúca ProductA class ConcreteCreatorA extends Creator { factoryMethod() { return new ConcreteProductA(); } } // Rozhranie produktu class Product { operation() { throw new Error("Metóda musí byť implementovaná podtriedami"); } } // Konkrétny produkt vytvorený ConcreteCreatorA class ConcreteProductA extends Product { operation() { return "Výsledok ConcreteProductA"; } } // Použitie const creator = new ConcreteCreatorA(); console.log(creator.anOperation()); - Abstraktná továreň (Abstract Factory): Poskytuje rozhranie na vytváranie rodín súvisiacich alebo závislých objektov bez špecifikácie ich konkrétnych tried.
// Rozhranie abstraktnej továrne class AbstractFactory { createProductA() { throw new Error("Metóda musí byť implementovaná podtriedami"); } createProductB() { throw new Error("Metóda musí byť implementovaná podtriedami"); } } // Konkrétna továreň na vytváranie produktov Variaant 1 class ConcreteFactory1 extends AbstractFactory { createProductA() { return new ConcreteProductA1(); } createProductB() { return new ConcreteProductB1(); } } // Konkrétna továreň na vytváranie produktov Variaant 2 class ConcreteFactory2 extends AbstractFactory { createProductA() { return new ConcreteProductA2(); } createProductB() { return new ConcreteProductB2(); } } // Rozhrania produktov class AbstractProductA { operationA() { throw new Error("Metóda musí byť implementovaná podtriedami"); } } class AbstractProductB { operationB() { throw new Error("Metóda musí byť implementovaná podtriedami"); } anotherOperationB(collaborator) { throw new Error("Metóda musí byť implementovaná podtriedami"); } } // Konkrétne produkty Variaant 1 class ConcreteProductA1 extends AbstractProductA { operationA() { return "Výsledok ConcreteProductA1"; } } class ConcreteProductB1 extends AbstractProductB { operationB() { return "Výsledok ConcreteProductB1"; } anotherOperationB(collaborator) { return `Výsledok ConcreteProductB1 spolu s ${collaborator.operationA()}`; } } // Konkrétne produkty Variaant 2 class ConcreteProductA2 extends AbstractProductA { operationA() { return "Výsledok ConcreteProductA2"; } } class ConcreteProductB2 extends AbstractProductB { operationB() { return "Výsledok ConcreteProductB2"; } anotherOperationB(collaborator) { return `Výsledok ConcreteProductB2 spolu s ${collaborator.operationA()}`; } } // Použitie function clientCode(factory) { const productA = factory.createProductA(); const productB = factory.createProductB(); console.log(productB.operationB()); console.log(productB.anotherOperationB(productA)); } console.log('Klient: Testovanie Factory1...'); clientCode(new ConcreteFactory1()); console.log('Klient: Testovanie Factory2...'); clientCode(new ConcreteFactory2()); - Staviteľ (Builder): Umožňuje vytvárať zložité objekty krok za krokom. Dáva možnosť použiť rovnaký proces stavby na získanie rôznych reprezentácií objektu.
// Rozhranie staviteľa class Builder { producePartA() { } producePartB() { } producePartC() { } } // Konkrétny staviteľ class ConcreteBuilder1 extends Builder { constructor() { super(); this.reset(); } reset() { this.product = new Product1(); } producePartA() { this.product.parts.push('ČasťA1'); } producePartB() { this.product.parts.push('ČasťB1'); } producePartC() { this.product.parts.push('ČasťC1'); } getProduct() { const result = this.product; this.reset(); return result; } } // Predstavovaný produkt class Product1 { constructor() { this.parts = []; } listParts() { console.log(`Časti produktu: ${this.parts.join(', ')}`); } } // Režisér (nepovinné, riadi proces stavby) class Director { setBuilder(builder) { this.builder = builder; } buildMinimalViableProduct() { this.builder.producePartA(); } buildFullFeaturedProduct() { this.builder.producePartA(); this.builder.producePartB(); this.builder.producePartC(); } } // Použitie const director = new Director(); const builder = new ConcreteBuilder1(); director.setBuilder(builder); console.log('Štandardný minimálny produkt:'); director.buildMinimalViableProduct(); builder.getProduct().listParts(); console.log('Štandardný plnohodnotný produkt:'); director.buildFullFeaturedProduct(); builder.getProduct().listParts(); console.log('Používateľský produkt:'); builder.producePartA(); builder.producePartC(); builder.getProduct().listParts(); - Prototyp (Prototype): Umožňuje kopírovať existujúce objekty, bez podrobného poznania ich implementácie.
// Rozhranie prototypu class Prototype { clone() { throw new Error("Metóda musí byť implementovaná podtriedami"); } } // Konkrétny prototyp class ConcretePrototype1 extends Prototype { constructor(property) { super(); this.property = property; } clone() { const clone = new ConcretePrototype1(this.property); // Môže sa pridať hlboké kopírovanie ďalších vlastností, ak je potrebné return clone; } } // Použitie const original = new ConcretePrototype1("hodnota"); const clone = original.clone(); console.log(`Originál property: ${original.property}`); console.log(`Kópia property: ${clone.property}`); // Kontrola, že ide o odlišné objekty console.log(`Rovnaké objekty? ${original === clone}`); - Jednotka (Singleton): Zaručuje, že má trieda iba jeden inštanciu, a poskytuje k nej globálny prístup.
class Singleton { static instance; constructor() { if (Singleton.instance) { return Singleton.instance; } Singleton.instance = this; } someBusinessLogic() { // ... } } // Použitie const s1 = new Singleton(); const s2 = new Singleton(); console.log(`Rovnaké inštancie? ${s1 === s2}`);