Найти в Дзене
Записки о Java

Все паттерны GoF в Java: полный справочник для разработчика

Стек: Java 11, паттерны проектирования (GoF)
Цель: дать структурированный обзор всех 23 паттернов, чтобы вы могли быстро найти нужный, понять его назначение и увидеть пример на Java. GoF (Gang of Four) — это авторы книги «Design Patterns: Elements of Reusable Object-Oriented Software» (1994):
Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides. Они описали 23 классических паттерна проектирования, разделённых на три категории: Решают задачу создания объектов, скрывая логику инстанцирования. Гарантирует, что у класса только один экземпляр, и предоставляет к нему глобальную точку доступа. ✅ Используйте: для логгеров, конфигураций, пулов соединений.
⚠️ Избегайте: в многопоточных средах без volatile и двойной проверки. Определяет интерфейс для создания объекта, но позволяет подклассам выбрать класс. ✅ Используйте: когда тип объекта определяется во время выполнения. Создаёт семейства связанных объектов без привязки к конкретным классам. ✅ Используйте: для кроссплатформенных UI-биб
Оглавление
Рисунок: паттерны GOG в JAVA
Рисунок: паттерны GOG в JAVA

Стек: Java 11, паттерны проектирования (GoF)
Цель: дать структурированный обзор всех 23 паттернов, чтобы вы могли быстро найти нужный, понять его назначение и увидеть пример на Java.

Что такое GoF?

GoF (Gang of Four) — это авторы книги «Design Patterns: Elements of Reusable Object-Oriented Software» (1994):
Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides.

Они описали 23 классических паттерна проектирования, разделённых на три категории:

  1. Порождающие (Creational) — создание объектов.
  2. Структурные (Structural) — компоновка объектов и классов.
  3. Поведенческие (Behavioral) — взаимодействие между объектами.

Порождающие паттерны (Creational Patterns)

Решают задачу создания объектов, скрывая логику инстанцирования.

1.1. Singleton — Одиночка

Гарантирует, что у класса только один экземпляр, и предоставляет к нему глобальную точку доступа.
Рисунок: Паттерн Singleton
Рисунок: Паттерн Singleton

✅ Используйте: для логгеров, конфигураций, пулов соединений.
⚠️ Избегайте: в многопоточных средах без volatile и двойной проверки.

1.2. Factory Method — Фабричный метод

Определяет интерфейс для создания объекта, но позволяет подклассам выбрать класс.
Риунок: паттерн Factory Method
Риунок: паттерн Factory Method

✅ Используйте: когда тип объекта определяется во время выполнения.

1.3. Abstract Factory — Абстрактная фабрика

Создаёт семейства связанных объектов без привязки к конкретным классам.
Рисунок: паттерн Abstract Factory
Рисунок: паттерн Abstract Factory

✅ Используйте: для кроссплатформенных UI-библиотек.

1.4. Builder — Строитель

Позволяет создавать сложные объекты пошагово.
Рисунок: паттерн Builder
Рисунок: паттерн Builder
Рисунок: пример использования паттерна Builder
Рисунок: пример использования паттерна Builder

1.5. Prototype — Прототип

Позволяет копировать объекты, не вдаваясь в детали их реализации.
Рисунок: паттерн Prototype
Рисунок: паттерн Prototype

✅ Используйте: когда создание объекта дороже клонирования.

🔗 2. Структурные паттерны (Structural Patterns)

Упрощают дизайн за счёт компоновки объектов и классов.

2.1. Adapter — Адаптер

Позволяет объектам с несовместимыми интерфейсами работать вместе.
Рисунок: паттерн Adapter
Рисунок: паттерн Adapter

✅ Используйте: при интеграции legacy-кода или сторонних библиотек.

2.2. Bridge — Мост

Разделяет абстракцию и реализацию, чтобы они могли изменяться независимо.
Рисунок: паттерн Bridge
Рисунок: паттерн Bridge

✅ Используйте: когда и абстракция, и реализация меняются часто.

2.3. Composite — Компоновщик

Позволяет работать с древовидными структурами как с единым объектом.
Рисунок: паттерн Composite
Рисунок: паттерн Composite

✅ Используйте: для файловых систем, UI-деревьев.

2.4. Decorator — Декоратор

Добавляет новое поведение объекту динамически.
Рисунок: паттерн Decorator
Рисунок: паттерн Decorator

✅ Используйте: для расширения функциональности без наследования (например, BufferedInputStream).

2.5. Facade — Фасад

Предоставляет упрощённый интерфейс к сложной подсистеме.
Рисунок: паттерн Facade, часть 1
Рисунок: паттерн Facade, часть 1
Рисунок: паттерн Facade, часть 2
Рисунок: паттерн Facade, часть 2

✅ Используйте: для упрощения работы с микросервисами или сложными API.

2.6. Flyweight — Приспособленец

Экономит память, разделяя общее состояние между множеством мелких объектов.
Рисунок: паттерн Flyweight
Рисунок: паттерн Flyweight

✅ Используйте: в играх (трава, деревья), текстовых редакторах (символы).

2.7. Proxy — Заместитель

Контролирует доступ к объекту, добавляя логику (ленивая инициализация, безопасность).
Рисунок: паттерн Proxy, часть 1
Рисунок: паттерн Proxy, часть 1
Рисунок: паттерн Proxy, часть 2
Рисунок: паттерн Proxy, часть 2

✅ Используйте: для lazy loading, контроля доступа, логирования.

🔄 3. Поведенческие паттерны (Behavioral Patterns)

Описывают взаимодействие между объектами и распределение обязанностей.

3.1. Chain of Responsibility — Цепочка обязанностей

Передаёт запрос по цепочке обработчиков.
Рисунок: паттерн Chain of Responsibility
Рисунок: паттерн Chain of Responsibility

✅ Используйте: для middleware (Spring Security), логирования.

3.2. Command — Команда

Инкапсулирует запрос как объект, позволяя параметризовать клиентов.
Рисунок: паттерн  Command
Рисунок: паттерн Command

✅ Используйте: для отмены операций, очередей задач.

3.3. Iterator — Итератор

Предоставляет способ последовательного обхода элементов коллекции.
Рисунок: паттерн Iterator
Рисунок: паттерн Iterator

✅ Используйте: всегда, когда нужно обходить коллекцию.

3.4. Mediator — Посредник

Инкапсулирует взаимодействие между объектами, уменьшая связанность.
Рисунок: паттерн Mediator
Рисунок: паттерн Mediator

✅ Используйте: для чатов, диалоговых окон.

3.5. Memento — Хранитель

Сохраняет внутреннее состояние объекта, не нарушая инкапсуляцию.
Рисунок: паттерн Memento
Рисунок: паттерн Memento

✅ Используйте: для undo/redo, сохранения состояния игры.

3.6. Observer — Наблюдатель

Определяет зависимость “один ко многим”.
Рисунок: паттерн Observer
Рисунок: паттерн Observer

✅ Используйте: для реактивных систем, event-driven архитектуры.

3.7. State — Состояние

Позволяет объекту менять своё поведение в зависимости от внутреннего состояния.
Рисунок: паттерн State
Рисунок: паттерн State

✅ Используйте: для конечных автоматов (машины состояний).

3.8. Strategy — Стратегия

Позволяет выбирать алгоритм во время выполнения.
Рисунок: паттерн Strategy
Рисунок: паттерн Strategy

✅ Используйте: постоянно! Это основа гибкости.

3.9. Template Method — Шаблонный метод

Определяет скелет алгоритма, позволяя подклассам переопределять шаги.
Рисунок: паттерн Template Method
Рисунок: паттерн Template Method

✅ Используйте: в фреймворках (Spring JdbcTemplate).

3.10. Visitor — Посетитель

Позволяет добавлять новые операции к объектам без изменения их классов.
Рисунок: паттерн Visitor
Рисунок: паттерн Visitor

✅ Используйте: редко, но мощно для анализа AST, сериализации.

✅ Заключение

Паттерны GoF — это не готовые решения, а язык для обсуждения архитектуры.
Знание их позволяет:

  • Читать код фреймворков (Spring, Hibernate),
  • Проектировать гибкие и поддерживаемые системы,
  • Эффективно общаться в команде.
🔑 Главное правило:
Не применяйте паттерны ради паттернов.
Применяйте их, когда
решаете реальную проблему проектирования.