Sobes.tech
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}`);