Назад к вопросам
Middle+
389
questionbank

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

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

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, где часто предпочтение отдается функциональным или прототипно-ориентированным подходам.