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