Sobes.tech
Middle+

Практикада кайсы дизайн үлгүлөрүн колдондуңуз?

sobes.tech AI

AIден жооп

Практикада мен төмөнкү дизайн үлгүлөрүн колдонуп келгем:

  1. Фабрика ыкмасы (Factory Method): Төрдүү түрдөгү объекттерди түзүүдө, конкреттүү класс көрсөтүүнөстөн. Бул ар кандай маалымат булагы же конфигурациялар менен иштөөдө ыңгайлуу.

    // Фабрика ыкмасын колдонуу мисалы
    class DataReader {
      read() {
        throw new Error("Method not implemented");
      }
    }
    
    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();
    
  2. Бирдиктүү (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); // чын
    
  3. Көзөмөлчү (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("Жаңы маалымат жеткиликтүү!");
    
  4. Стратегия (Strategy): Алгоритмдердин үй-бүлөсүн аныктоо, ар бирин коду менен капталы жана алмаштырылуучу кылуу. Алгоритм өзгөргөн сайын, аны колдонгон кардарлар да өзгөрөт. Мисалы, маалымат иштетүү же операцияларды аткаруу үчүн.

    // Стратегияны колдонуу мисалы
    class PaymentStrategy {
      pay(amount) {
        throw new Error("Мethoд ишке ашкан эмес");
      }
    }
    
    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);
    
  5. Декоратор (Decorator): Объектке динамикалык жаңы функцияларды кошуу үчүн, анын структурасын өзгөртпөстөн. Бар объектти каптайт жана ошол эле интерфейсти камсыздайт, бирок кошумча функциялдуулук менен. Логгинг, валидация, кэшдөө үчүн ыңгайлуу.

    // Декоратор колдонуу мисалы
    class Component {
      operation() {
        return "Негизги компонент";
      }
    }
    
    class Decorator {
      constructor(component) {
        this.component = component;
      }
    
      operation() {
        return this.component.operation();
      }
    }
    
    class ConcreteDecoratorA extends Decorator {
      operation() {
        return `КонкретДекораторA(${super.operation()})`;
      }
    }
    
    class ConcreteDecoratorB extends Decorator {
      operation() {
        return `КонкретДекораторB(${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());
    
  6. Модуль (Module): Node.js системасында модуль системасы (CommonJS, ES Modules) бар, бирок JavaScriptте Module pattern (негизинен, нативдүү модулдар пайда болгонго чейин) колдонулуп келген. Бул кодду инкапсуляциялоо үчүн негиз болуп саналат.

Бул үлгүлөр мага структураланган, кеңейтүлүүчү жана оңой тейлөөчү код түзүүгө жардам берди.