Middle
Ονομάστε τα μοτίβα που ανήκουν στα δημιουργικά.
sobes.tech AI
Απάντηση από AI
- Factory Method: Καθορίζει το interface για τη δημιουργία αντικειμένων, αλλά επιτρέπει στις υποκλάσεις να αποφασίζουν ποια κλάση να δημιουργήσουν.
// Interface κατασκευαστή class Creator { factoryMethod() { throw new Error("Η μέθοδος πρέπει να υλοποιείται από τις υποκλάσεις"); } anOperation() { const product = this.factoryMethod(); return `Δημιουργός: η ίδια λογική που μόλις λειτούργησε με ${product.operation()}`; } } // Συγκεκριμένος κατασκευαστής που δημιουργεί ProductA class ConcreteCreatorA extends Creator { factoryMethod() { return new ConcreteProductA(); } } // Διεπαφή προϊόντος class Product { operation() { throw new Error("Η μέθοδος πρέπει να υλοποιείται από τις υποκλάσεις"); } } // Συγκεκριμένο προϊόν που δημιουργείται από τον ConcreteCreatorA class ConcreteProductA extends Product { operation() { return "Αποτέλεσμα του ConcreteProductA"; } } // Χρήση const creator = new ConcreteCreatorA(); console.log(creator.anOperation()); - Αφηρημένο Εργοστάσιο: Παρέχει ένα interface για τη δημιουργία οικογενειών σχετικών ή εξαρτώμενων αντικειμένων, χωρίς να καθορίζει τις συγκεκριμένες κλάσεις τους.
// Interface αφηρημένου εργοστασίου class AbstractFactory { createProductA() { throw new Error("Η μέθοδος πρέπει να υλοποιείται από τις υποκλάσεις"); } createProductB() { throw new Error("Η μέθοδος πρέπει να υλοποιείται από τις υποκλάσεις"); } } // Συγκεκριμένο εργοστάσιο για δημιουργία προϊόντων Επιλογή 1 class ConcreteFactory1 extends AbstractFactory { createProductA() { return new ConcreteProductA1(); } createProductB() { return new ConcreteProductB1(); } } // Συγκεκριμένο εργοστάσιο για δημιουργία προϊόντων Επιλογή 2 class ConcreteFactory2 extends AbstractFactory { createProductA() { return new ConcreteProductA2(); } createProductB() { return new ConcreteProductB2(); } } // Διεπαφές προϊόντων class AbstractProductA { operationA() { throw new Error("Η μέθοδος πρέπει να υλοποιείται από τις υποκλάσεις"); } } class AbstractProductB { operationB() { throw new Error("Η μέθοδος πρέπει να υλοποιείται από τις υποκλάσεις"); } anotherOperationB(collaborator) { throw new Error("Η μέθοδος πρέπει να υλοποιείται από τις υποκλάσεις"); } } // Συγκεκριμένα προϊόντα Επιλογή 1 class ConcreteProductA1 extends AbstractProductA { operationA() { return "Αποτέλεσμα ConcreteProductA1"; } } class ConcreteProductB1 extends AbstractProductB { operationB() { return "Αποτέλεσμα ConcreteProductB1"; } anotherOperationB(collaborator) { return `Αποτέλεσμα ConcreteProductB1 μαζί με ${collaborator.operationA()}`; } } // Συγκεκριμένα προϊόντα Επιλογή 2 class ConcreteProductA2 extends AbstractProductA { operationA() { return "Αποτέλεσμα ConcreteProductA2"; } } class ConcreteProductB2 extends AbstractProductB { operationB() { return "Αποτέλεσμα ConcreteProductB2"; } anotherOperationB(collaborator) { return `Αποτέλεσμα ConcreteProductB2 μαζί με ${collaborator.operationA()}`; } } // Χρήση function clientCode(factory) { const productA = factory.createProductA(); const productB = factory.createProductB(); console.log(productB.operationB()); console.log(productB.anotherOperationB(productA)); } console.log('Πελάτης: Δοκιμή Factory1...'); clientCode(new ConcreteFactory1()); console.log('Πελάτης: Δοκιμή Factory2...'); clientCode(new ConcreteFactory2()); - Κατασκευαστής (Builder): Επιτρέπει τη δημιουργία πολύπλοκων αντικειμένων βήμα προς βήμα. Δίνει τη δυνατότητα να χρησιμοποιείται η ίδια διαδικασία κατασκευής για την απόκτηση διαφορετικών αναπαραστάσεων του αντικειμένου.
// Interface κατασκευαστή class Builder { producePartA() { } producePartB() { } producePartC() { } } // Συγκεκριμένος κατασκευαστής 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; } } // Προϊόν που παρουσιάζεται class Product1 { constructor() { this.parts = []; } listParts() { console.log(`Μέρη του προϊόντος: ${this.parts.join(', ')}`); } } // Διευθυντής (προαιρετικό, διαχειρίζεται τη διαδικασία κατασκευής) class Director { setBuilder(builder) { this.builder = builder; } buildMinimalViableProduct() { this.builder.producePartA(); } buildFullFeaturedProduct() { this.builder.producePartA(); this.builder.producePartB(); this.builder.producePartC(); } } // Χρήση const director = new Director(); const builder = new ConcreteBuilder1(); director.setBuilder(builder); console.log('Τυπικό ελάχιστο προϊόν:'); director.buildMinimalViableProduct(); builder.getProduct().listParts(); console.log('Τυπικό πλήρες προϊόν:'); director.buildFullFeaturedProduct(); builder.getProduct().listParts(); console.log('Προσαρμοσμένο προϊόν:'); builder.producePartA(); builder.producePartC(); builder.getProduct().listParts(); - Πρωτότυπο (Prototype): Επιτρέπει την αντιγραφή υπαρχόντων αντικειμένων, χωρίς να εισέρχεται στις λεπτομέρειες της υλοποίησής τους.
// Διεπαφή πρωτοτύπου class Prototype { clone() { throw new Error("Η μέθοδος πρέπει να υλοποιείται από τις υποκλάσεις"); } } // Συγκεκριμένο πρωτότυπο class ConcretePrototype1 extends Prototype { constructor(property) { super(); this.property = property; } clone() { const clone = new ConcretePrototype1(this.property); // Μπορούν να προστεθούν βαθιές αντιγραφές άλλων ιδιοτήτων αν χρειάζεται return clone; } } // Χρήση const original = new ConcretePrototype1("τιμή"); const clone = original.clone(); console.log(`Αρχικό property: ${original.property}`); console.log(`Κλωνοποιημένο property: ${clone.property}`); // Έλεγχος αν είναι διαφορετικά αντικείμενα console.log(`Είναι διαφορετικά αντικείμενα; ${original === clone}`); - Μονόκλιος (Singleton): Διασφαλίζει ότι μια κλάση έχει μόνο ένα παράδειγμα και παρέχει μια παγκόσμια πρόσβαση σε αυτό.
class Singleton { static instance; constructor() { if (Singleton.instance) { return Singleton.instance; } Singleton.instance = this; } someBusinessLogic() { // ... } } // Χρήση const s1 = new Singleton(); const s2 = new Singleton(); console.log(`Τα ίδια παραδείγματα; ${s1 === s2}`);