Koje obrasce dizajna ste koristili u praksi?
sobes.tech АИ
Одговор од АИ
У пракси сам примењивао следеће шаблоне дизајна:
-
Фабрички метод (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): За гаранцију да постоји само један пример класе и пружање глобалне тачке приступа. Често се користи за менаџере конфигурација или везе са базама података.
// Пример коришћења синглтона 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): За динамично додавање нове функционалности објекту без промене његове структуре. Обавија постојећи објекат, пружајући исти интерфејс као и обавијени, али са доданом функционалношћу. Употребљиво за логовање, валидирање, кеширање.
// Пример коришћења декоратора 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): Иако је систем модула у Node.js уграђен (CommonJS, ES Modules), шаблон Module pattern у JavaScript-у (пре појаве нативних модула) се користио за креирање приватних чланова и јавног интерфејса. Ово је основа за изградњу инкапсулираног кода.
Ови шаблони су ми помогли да креирам структуриран, скалабилан и одржив код.