Middle
Nevezze meg a létrehozó mintákat.
sobes.tech MI
Válasz az MI-től
- Gyári módszer (Factory Method): Meghatározza az objektumok létrehozásának felületét, de lehetővé teszi az alosztályok számára, hogy eldöntsék, melyik osztály példányosítandó.
// Gyártói felület class Creator { factoryMethod() { throw new Error("A metódust alosztályoknak kell megvalósítaniuk"); } anOperation() { const product = this.factoryMethod(); return `Creator: ugyanaz a logika, csak most ${product.operation()}`; } } // Konkrét gyártó, amely létrehozza a ProductA-t class ConcreteCreatorA extends Creator { factoryMethod() { return new ConcreteProductA(); } } // Termék felülete class Product { operation() { throw new Error("A metódust alosztályoknak kell megvalósítaniuk"); } } // Konkrét termék, amelyet a ConcreteCreatorA hoz létre class ConcreteProductA extends Product { operation() { return "ConcreteProductA eredménye"; } } // Használat const creator = new ConcreteCreatorA(); console.log(creator.anOperation()); - Absztrakt gyár (Abstract Factory): Felületet biztosít kapcsolódó vagy függő objektumcsaládok létrehozására anélkül, hogy meg kellene határozni azok konkrét osztályait.
// Absztrakt gyár felülete class AbstractFactory { createProductA() { throw new Error("A metódust alosztályoknak kell megvalósítaniuk"); } createProductB() { throw new Error("A metódust alosztályoknak kell megvalósítaniuk"); } } // Konkrét gyár az 1-es változathoz class ConcreteFactory1 extends AbstractFactory { createProductA() { return new ConcreteProductA1(); } createProductB() { return new ConcreteProductB1(); } } // Konkrét gyár a 2-es változathoz class ConcreteFactory2 extends AbstractFactory { createProductA() { return new ConcreteProductA2(); } createProductB() { return new ConcreteProductB2(); } } // Termék felületek class AbstractProductA { operationA() { throw new Error("A metódust alosztályoknak kell megvalósítaniuk"); } } class AbstractProductB { operationB() { throw new Error("A metódust alosztályoknak kell megvalósítaniuk"); } anotherOperationB(collaborator) { throw new Error("A metódust alosztályoknak kell megvalósítaniuk"); } } // Konkrét termékek az 1-es változathoz class ConcreteProductA1 extends AbstractProductA { operationA() { return "ConcreteProductA1 eredménye"; } } class ConcreteProductB1 extends AbstractProductB { operationB() { return "ConcreteProductB1 eredménye"; } anotherOperationB(collaborator) { return `ConcreteProductB1 eredménye együttműködve ${collaborator.operationA()}`; } } // Konkrét termékek a 2-es változathoz class ConcreteProductA2 extends AbstractProductA { operationA() { return "ConcreteProductA2 eredménye"; } } class ConcreteProductB2 extends AbstractProductB { operationB() { return "ConcreteProductB2 eredménye"; } anotherOperationB(collaborator) { return `ConcreteProductB2 eredménye együttműködve ${collaborator.operationA()}`; } } // Használat function clientCode(factory) { const productA = factory.createProductA(); const productB = factory.createProductB(); console.log(productB.operationB()); console.log(productB.anotherOperationB(productA)); } console.log('Ügyfél: Factory1 tesztelése...'); clientCode(new ConcreteFactory1()); console.log('Ügyfél: Factory2 tesztelése...'); clientCode(new ConcreteFactory2()); - Építész (Builder): Lehetővé teszi összetett objektumok lépésenkénti létrehozását. Ugyanazt a felépítési folyamatot használja különböző megjelenítések eléréséhez.
// Építő felülete class Builder { producePartA() { } producePartB() { } producePartC() { } } // Konkrét építő 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; } } // A termék, amit bemutatunk class Product1 { constructor() { this.parts = []; } listParts() { console.log(`A termék részei: ${this.parts.join(', ')}`); } } // Igazgató (nem kötelező, irányítja az építési folyamatot) class Director { setBuilder(builder) { this.builder = builder; } buildMinimalViableProduct() { this.builder.producePartA(); } buildFullFeaturedProduct() { this.builder.producePartA(); this.builder.producePartB(); this.builder.producePartC(); } } // Használat const director = new Director(); const builder = new ConcreteBuilder1(); director.setBuilder(builder); console.log('Alapértelmezett minimális termék:'); director.buildMinimalViableProduct(); builder.getProduct().listParts(); console.log('Alapértelmezett teljes termék:'); director.buildFullFeaturedProduct(); builder.getProduct().listParts(); console.log('Felhasználói termék:'); builder.producePartA(); builder.producePartC(); builder.getProduct().listParts(); - Prototípus (Prototype): Lehetővé teszi meglévő objektumok másolását anélkül, hogy részletekbe bocsátkozna azok megvalósításában.
// Prototípus felülete class Prototype { clone() { throw new Error("A metódust alosztályoknak kell megvalósítaniuk"); } } // Konkrét prototípus class ConcretePrototype1 extends Prototype { constructor(property) { super(); this.property = property; } clone() { const clone = new ConcretePrototype1(this.property); // Mély másolat készítése más tulajdonságokról, ha szükséges return clone; } } // Használat const original = new ConcretePrototype1("érték"); const clone = original.clone(); console.log(`Eredeti property: ${original.property}`); console.log(`Másolat property: ${clone.property}`); // Ellenőrzés, hogy különböző objektumok-e console.log(`Ugyanazok az objektumok? ${original === clone}`); - Singleton (Egyszemélyes): Biztosítja, hogy egy osztálynak csak egy példánya legyen, és globális hozzáférést biztosítson hozzá.
class Singleton { static instance; constructor() { if (Singleton.instance) { return Singleton.instance; } Singleton.instance = this; } someBusinessLogic() { // ... } } // Használat const s1 = new Singleton(); const s2 = new Singleton(); console.log(`Ugyanazok a példányok? ${s1 === s2}`);