Sobes.tech
Middle+
565
questionbank

Какие паттерны распространены в Java, которые не встречаются в JavaScript и TypeScript?

AI答案

sobes.tech AI

Фабричный метод, Абстрактная фабрика, Строитель (Builder), Одиночка (Singleton), Прототип, Адаптер, Декоратор, Фасад, Легковес (Flyweight), Заместитель (Proxy), Команда (Command), Итератор (Iterator), Посредник (Mediator), Хранитель (Memento), Наблюдатель (Observer - хотя в JS есть EventEmitter/RxJS, паттерн "из коробки" встречается реже в классическом виде), Состояние (State), Стратегия (Strategy), Шаблонный метод (Template Method).

В JavaScript/TypeScript многие из этих задач решаются иными средствами:

  • Прототипное наследование вместо классического.
  • Функции высшего порядка и замыкания.
  • Динамическая типизация (для JS).
  • Модульная система.

Например:

  • Singleton: В JS/TS часто реализуется через модули или замыкания, а не через статические методы класса.
    // Реализация Singleton через модуль
    const singletonInstance = {
      data: 'some data'
    };
    
    module.exports = singletonInstance;
    
  • Factory Method / Abstract Factory: В JS/TS часто используются функции, возвращающие объекты, или простые классы. Нет жесткой необходимости в интерфейсах и абстрактных классах в том же смысле, что в Java.
    // Простая "фабрика" в JS
    function createObject(type) {
      if (type === 'A') {
        return { name: 'Object A' };
      } else if (type === 'B') {
        return { name: 'Object B' };
      }
      return null;
    }
    
  • Decorator: В JS/TS это либо функции-обертки, либо синтаксис декораторов (экспериментальный или стандартизированный в TS).
    // Пример декоратора в TypeScript
    function logMethod(target: any, propertyKey: string, descriptor: PropertyDescriptor) {
      const originalMethod = descriptor.value;
    
      descriptor.value = function(...args: any[]) {
        console.log(`Calling ${propertyKey} with args: ${JSON.stringify(args)}`);
        const result = originalMethod.apply(this, args);
        console.log(`Method ${propertyKey} returned: ${JSON.stringify(result)}`);
        return result;
      };
    
      return descriptor;
    }
    
    class MyClass {
      @logMethod
      myMethod(arg1: string): string {
        return `Processed: ${arg1}`;
      }
    }
    
  • Builder: В JS/TS часто реализуется через цепочки вызовов методов или простые объектные литералы.
    // Пример "билдера" через цепочку вызовов
    class Config {
      constructor() {
        this._settings = {};
      }
    
      withSetting(key, value) {
        this._settings[key] = value;
        return this; // Возвращаем this для цепочки
      }
    
      build() {
        return this._settings;
      }
    }
    
    const myConfig = new Config()
      .withSetting('timeout', 1000)
      .withSetting('retry', 3)
      .build();
    

Паттерны GOF, разработанные в контексте ООП языков вроде Java, могут быть менее идиоматичными или излишне сложными для JavaScript/TypeScript, где часто предпочтение отдается функциональным или прототипно-ориентированным подходам.