Паттерны проектирования
Паттерн проектирования — это выверенный ответ на повторяющуюся задачу структуры кода. В JavaScript их реализуют не как в Java: вместо жёстких интерфейсов работают замыкания, объекты первого класса и классы ES6. Поэтому один и тот же паттерн часто имеет две формы — на замыкании и на классе.
На собеседовании из всего каталога GoF чаще всего просят три: фабричную функцию (и чем она отличается от new), абстрактную фабрику (порождающий паттерн, отвязывающий вызывающий код от конкретных конструкторов) и декоратор (структурный паттерн, расширяющий поведение объекта без правки его класса). Их разбор — в слое ниже.
Карта темы
- Классические паттерны — фабрика, абстрактная фабрика, декоратор — три паттерна GoF на JavaScript, их механика и типичные ловушки на собеседовании.
Частые ошибки и ловушки
| Ошибка | Последствие |
|---|---|
Вызывать фабричную функцию через new | Лишний привязанный this; фабрика и так возвращает объект |
Считать, что объекты от фабрики делят прототип, как от new | Нет автоматической связи с прототипом — это разные механизмы |
Позволять базовому create абстрактной фабрики что-то возвращать | Абстрактную фабрику можно вызвать напрямую — теряется смысл |
Забыть ветку default/else в фабрике | Неизвестный тип молча возвращает undefined вместо исключения |
| Править обёрнутый класс вместо оборачивания в декораторе | Нарушен принцип «открыт для расширения, закрыт для изменения» |
Забыть super.do(...) в декораторе | Внутренний объект цепочки так и не вызывается |
Значение для собеседований
Паттерны проверяют как индикатор зрелости: понимаете ли вы механику под именем, а не просто помните название. Кандидат, который объясняет фабрику через «функция, возвращающая объект без this-привязки и с приватным состоянием в замыкании», сильнее того, кто говорит «фабрика создаёт объекты».
Что обычно проверяют:
- Чем фабричная функция отличается от конструктора с
new(нетthis-привязки, нет автоприкрепления прототипа, приватное состояние в замыкании). - Как абстрактная фабрика отвязывает вызывающий код от конкретных продуктов.
- Как декоратор расширяет поведение, не трогая исходный класс, и почему общий интерфейс даёт композицию.
Типичный неверный ответ: «декоратор — это просто наследование от класса». Наследование фиксирует расширение в одном подклассе; декоратор же оборачивает объект в рантайме, и декораторы с общим интерфейсом складываются в любом порядке и в любом числе.