Middle
Pavadinkite kūrybinius modelius.
sobes.tech AI
Atsakymas iš AI
- Fabrikos metodas (Factory Method): Nustato sąsająį objektų kūrimui, bet leidžia pogrupiams nuspręsti, kurį klasės instanciją naudoti.
// Fabrikos sąsaja class Creator { factoryMethod() { throw new Error("Metodas turi būti įgyvendintas pogrupiuose"); } anOperation() { const product = this.factoryMethod(); return `Kūrėjas: ta pati logika, tik ką dirbo su ${product.operation()}`; } } // Konkretus kūrėjas, kuris kuria ProductA class ConcreteCreatorA extends Creator { factoryMethod() { return new ConcreteProductA(); } } // Produkto sąsaja class Product { operation() { throw new Error("Metodas turi būti įgyvendintas pogrupiuose"); } } // Konkretus produktas, sukurtas ConcreteCreatorA class ConcreteProductA extends Product { operation() { return "ConcreteProductA rezultatas"; } } // Naudojimas const creator = new ConcreteCreatorA(); console.log(creator.anOperation()); - Abstract Factory (Abstrakti gamykla): Teikia sąsają, leidžiančią kurti susijusius arba priklausomus objektų šeimas, nenurodant jų konkrečių klasių.
// Abstrakčios gamyklos sąsaja class AbstractFactory { createProductA() { throw new Error("Metodas turi būti įgyvendintas pogrupiuose"); } createProductB() { throw new Error("Metodas turi būti įgyvendintas pogrupiuose"); } } // Konkretus gamintojas 1 class ConcreteFactory1 extends AbstractFactory { createProductA() { return new ConcreteProductA1(); } createProductB() { return new ConcreteProductB1(); } } // Konkretus gamintojas 2 class ConcreteFactory2 extends AbstractFactory { createProductA() { return new ConcreteProductA2(); } createProductB() { return new ConcreteProductB2(); } } // Produktų sąsajos class AbstractProductA { operationA() { throw new Error("Metodas turi būti įgyvendintas pogrupiuose"); } } class AbstractProductB { operationB() { throw new Error("Metodas turi būti įgyvendintas pogrupiuose"); } anotherOperationB(collaborator) { throw new Error("Metodas turi būti įgyvendintas pogrupiuose"); } } // Konkretūs produktai 1-oji versija class ConcreteProductA1 extends AbstractProductA { operationA() { return "ConcreteProductA1 rezultatas"; } } class ConcreteProductB1 extends AbstractProductB { operationB() { return "ConcreteProductB1 rezultatas"; } anotherOperationB(collaborator) { return `ConcreteProductB1 rezultatas bendradarbiaujant su ${collaborator.operationA()}`; } } // Konkretūs produktai 2-oji versija class ConcreteProductA2 extends AbstractProductA { operationA() { return "ConcreteProductA2 rezultatas"; } } class ConcreteProductB2 extends AbstractProductB { operationB() { return "ConcreteProductB2 rezultatas"; } anotherOperationB(collaborator) { return `ConcreteProductB2 rezultatas bendradarbiaujant su ${collaborator.operationA()}`; } } // Naudojimas function clientCode(factory) { const productA = factory.createProductA(); const productB = factory.createProductB(); console.log(productB.operationB()); console.log(productB.anotherOperationB(productA)); } console.log('Kliento: Factory1 testas...'); clientCode(new ConcreteFactory1()); console.log('Kliento: Factory2 testas...'); clientCode(new ConcreteFactory2()); - Statybininkas (Builder): Leidžia kurti sudėtingus objektus žingsnis po žingsnio. Suteikia galimybę naudoti tą patį statybos procesą skirtingiems objekto vaizdams gauti.
// Statybos sąsaja class Builder { producePartA() { } producePartB() { } producePartC() { } } // Konkretus statybininkas 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; } } // Vaizduojamas produktas class Product1 { constructor() { this.parts = []; } listParts() { console.log(`Produkto dalys: ${this.parts.join(', ')}`); } } // Direktorius (nebūtinas, valdo statybos procesą) class Director { setBuilder(builder) { this.builder = builder; } buildMinimalViableProduct() { this.builder.producePartA(); } buildFullFeaturedProduct() { this.builder.producePartA(); this.builder.producePartB(); this.builder.producePartC(); } } // Naudojimas const director = new Director(); const builder = new ConcreteBuilder1(); director.setBuilder(builder); console.log('Standartinis minimalus produktas:'); director.buildMinimalViableProduct(); builder.getProduct().listParts(); console.log('Standartinis pilnas produktas:'); director.buildFullFeaturedProduct(); builder.getProduct().listParts(); console.log('Vartotojo produktas:'); builder.producePartA(); builder.producePartC(); builder.getProduct().listParts(); - Prototipas (Prototype): Leidžia kopijuoti esamus objektus, ne įsitraukiant į jų įgyvendinimo detales.
// Prototipo sąsaja class Prototype { clone() { throw new Error("Metodas turi būti įgyvendintas pogrupiuose"); } } // Konkretus prototipas class ConcretePrototype1 extends Prototype { constructor(property) { super(); this.property = property; } clone() { const clone = new ConcretePrototype1(this.property); // Gali būti atliekamas gilus kopijavimas kitų savybių return clone; } } // Naudojimas const original = new ConcretePrototype1("reikšmė"); const clone = original.clone(); console.log(`Originalo property: ${original.property}`); console.log(`Klonas property: ${clone.property}`); // Patikrinimas, ar tai skirtingi objektai console.log(`Ar tie patys objektai? ${original === clone}`); - Singleton (Vienintelis): Garantuoja, kad klasės yra tik viena instancija, ir suteikia prieigą prie jos globaliai.
class Singleton { static instance; constructor() { if (Singleton.instance) { return Singleton.instance; } Singleton.instance = this; } someBusinessLogic() { // ... } } // Naudojimas const s1 = new Singleton(); const s2 = new Singleton(); console.log(`Ar tie patys instancijos? ${s1 === s2}`);