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