Паттерны проектирования
Паттерн проектирования — это не библиотека, которую импортируют и вызывают. Это именованный, переиспользуемый шаблон решения повторяющейся задачи: проверенная идея, которую вы адаптируете под свой код своими руками. Ценность паттерна в том, что у него есть имя: сказав «здесь нужна фабрика», вы за два слова передаёте коллеге целое решение.
Банда четырёх (GoF) делит паттерны на три семейства: создающие (порождающие) — про создание объектов, структурные — про то, как объекты компонуются, и поведенческие — про то, как объекты взаимодействуют и делят ответственность. Эта тема разбирает три самых спрашиваемых создающих паттерна — Singleton, Factory и Builder, — а слои ниже дают полную карту.
Карта темы
- Паттерны проектирования — что такое паттерн (шаблон, а не библиотека) и три категории GoF с примерами.
- Одиночка (Singleton) — ровно один экземпляр и глобальная точка доступа; как сделать ленивую инициализацию потокобезопасной.
- Фабрика (Factory) — создание объекта делегируется методу, возвращающему интерфейс; клиент развязан от конкретных классов.
- Строитель (Builder) — пошаговое конструирование через текучий API вместо телескопических конструкторов.
Частые ошибки и ловушки
| Ошибка | Последствие |
|---|---|
| Считать паттерн готовым кодом для импорта | Копируете чужой класс вместо адаптации шаблона — и потом боретесь с несовпадением имён и контекста |
Относить Factory к структурным паттернам | Путаница в категориях: factory — создающий паттерн (про создание объектов), а не про композицию |
Ленивый Singleton без синхронизации | Два потока проходят проверку == null в гонке и создают по экземпляру — гарантия единственности нарушена |
Забыть volatile в double-checked locking | Другой поток видит частично сконструированный объект (ссылка присвоена раньше, чем поля инициализированы) |
| Оставить построенный объект изменяемым | Теряется главная выгода Builder — неизменяемость результата |
Builder для тривиального объекта из двух полей | Лишняя косвенность; обычный конструктор здесь яснее и короче |
Значение для собеседований
Паттерны спрашивают не как заученные UML-диаграммы, а как проверку того, понимаете ли вы, какую проблему каждый паттерн решает, какие у него ловушки и когда обычный код проще. Кандидат, который говорит «singleton — это один экземпляр, и вот три способа сделать его потокобезопасным», сразу выделяется на фоне «ну, это когда объект один».
Что обычно проверяют:
- Три категории GoF и что решает каждая; почему паттерн — это шаблон, а не библиотека.
Singleton: гарантия единственного экземпляра и как сделать ленивую инициализацию потокобезопасной (enum, static-holder, double-checked locking наvolatile).Factory: как возврат интерфейса развязывает клиент от конкретных классов.Builder: проблема телескопических конструкторов и связь с неизменяемыми объектами.- Когда паттерн НЕ нужен — где обычный код проще.
Типичный неверный ответ: «Паттерн — это готовый класс из стандартной библиотеки, который импортируют и вызывают». Отсюда начинается разговор о том, что паттерн — это шаблон, адаптируемый под контекст, а не копипаст-код, и что переусердствовать с паттернами (навесить их там, где хватит обычного кода) — тоже ошибка.