Ποια μοτίβα σχεδίασης έχετε χρησιμοποιήσει στην πράξη;
sobes.tech AI
Απάντηση από AI
Στην πρακτική μου εφαρμογή χρησιμοποίησα τα ακόλουθα μοτίβα σχεδίασης:
-
Μέθοδος Εργοστασίου (Factory Method): Για τη δημιουργία αντικειμένων διαφορετικών τύπων χωρίς να καθορίζεται η συγκεκριμένη κλάση δημιουργίας. Χρησιμοποιείται όταν δουλεύουμε με διάφορες πηγές δεδομένων ή διαμορφώσεις.
// Παράδειγμα χρήσης της μεθόδου εργοστασίου class DataReader { read() { throw new Error("Μέθοδος μη υλοποιημένη"); } } class FileReader extends DataReader { read() { console.log("Ανάγνωση δεδομένων από αρχείο..."); } } class NetworkReader extends DataReader { read() { console.log("Ανάγνωση δεδομένων από δίκτυο..."); } } class DataReaderFactory { createReader(type) { switch (type) { case "file": return new FileReader(); case "network": return new NetworkReader(); default: throw new Error("Άγνωστος τύπος αναγνώστη"); } } } const factory = new DataReaderFactory(); const fileReader = factory.createReader("file"); fileReader.read(); -
Μονάδα (Singleton): Διασφαλίζει ότι υπάρχει μόνο ένα στιγμιότυπο μιας κλάσης και παρέχει παγκόσμια πρόσβαση σε αυτό. Χρησιμοποιείται συχνά για διαχειριστές διαμόρφωσης ή συνδέσεις βάσεων δεδομένων.
// Παράδειγμα χρήσης singleton class ConfigManager { constructor() { if (ConfigManager.instance) { return ConfigManager.instance; } this.config = {}; ConfigManager.instance = this; } setConfig(key, value) { this.config[key] = value; } getConfig(key) { return this.config[key]; } } const instance1 = new ConfigManager(); const instance2 = new ConfigManager(); console.log(instance1 === instance2); // true -
Παρατηρητής (Observer): Για την υλοποίηση σχέσης "ένας προς πολλούς", όπου όταν αλλάζει η κατάσταση ενός αντικειμένου (εκδότης), ενημερώνονται αυτόματα όλα τα εξαρτώμενα αντικείμενα (συνδρομητές). Χρησιμοποιείται σε συστήματα ειδοποιήσεων, αντιδραστικά περιβάλλοντα.
// Παράδειγμα χρήσης παρατηρητή class Observable { constructor() { this.observers = []; } subscribe(observer) { this.observers.push(observer); } unsubscribe(observer) { this.observers = this.observers.filter(obs => obs !== observer); } notify(data) { this.observers.forEach(observer => observer.update(data)); } } class Observer { update(data) { console.log("Λήφθηκε ενημέρωση:", data); } } const observable = new Observable(); const observer1 = new Observer(); const observer2 = new Observer(); observable.subscribe(observer1); observable.subscribe(observer2); observable.notify("Νέα δεδομένα διαθέσιμα!"); -
Στρατηγική (Strategy): Για τον ορισμό οικογενειών αλγορίθμων, την ενσωμάτωση καθενός και την διαθεσιμότητά τους για ανταλλαγή. Επιτρέπει την αλλαγή του αλγορίθμου ανεξάρτητα από τους πελάτες που τον χρησιμοποιούν. Χρησιμοποιείται για διάφορες επιλογές επεξεργασίας δεδομένων ή εκτέλεσης λειτουργιών.
// Παράδειγμα χρήσης στρατηγικής class PaymentStrategy { pay(amount) { throw new Error("Μέθοδος μη υλοποιημένη"); } } class CreditCardPayment extends PaymentStrategy { pay(amount) { console.log(`Πληρωμή ${amount} με πιστωτική κάρτα`); } } class PayPalPayment extends PaymentStrategy { pay(amount) { console.log(`Πληρωμή ${amount} μέσω PayPal`); } } class PaymentContext { setStrategy(strategy) { this.strategy = strategy; } executePayment(amount) { this.strategy.pay(amount); } } const context = new PaymentContext(); context.setStrategy(new CreditCardPayment()); context.executePayment(100); context.setStrategy(new PayPalPayment()); context.executePayment(50); -
Διακοσμητής (Decorator): Για την δυναμική προσθήκη νέας λειτουργικότητας σε ένα αντικείμενο χωρίς να αλλάξει η δομή του. Τυλίγει το υπάρχον αντικείμενο, παρέχοντας την ίδια διεπαφή με το τυλιγμένο, αλλά με πρόσθετη λειτουργικότητα. Χρησιμοποιείται για καταγραφή, επικύρωση, cache.
// Παράδειγμα χρήσης διακοσμητή class Component { operation() { return "Βασικό συστατικό"; } } class Decorator { constructor(component) { this.component = component; } operation() { return this.component.operation(); } } class ConcreteDecoratorA extends Decorator { operation() { return `ConcreteDecoratorA(${super.operation()})`; } } class ConcreteDecoratorB extends Decorator { operation() { return `ConcreteDecoratorB(${super.operation()})`; } } const simple = new Component(); console.log(simple.operation()); const decoratorA = new ConcreteDecoratorA(simple); console.log(decoratorA.operation()); const decoratorB = new ConcreteDecoratorB(decoratorA); console.log(decoratorB.operation()); -
Μονάδα (Module): Αν και το σύστημα modules στο Node.js είναι ενσωματωμένο (CommonJS, ES Modules), το μοτίβο Module στην JavaScript (πριν την εμφάνιση των native modules) χρησιμοποιούνταν για τη δημιουργία ιδιωτικών μελών και δημόσιου διεπαφής. Αυτό αποτελεί τη βάση για την κατασκευή κώδικα με ενθυλάκωση.
Αυτά τα μοτίβα με βοήθησαν να δημιουργήσω πιο δομημένο, επεκτάσιμο και εύκολο στη συντήρηση κώδικα.