Дополнительно о паттернах можно почитать в посте об ООП.
Предложенная таблица поможет соотнести реальные задачи программиста с подходящими паттернами проектирования:
| Описание ситуации | Название паттерна |
| Нужно гарантировать, что у программы будет только один объект для работы с настройками, логами или базой данных. | Singleton (Одиночка) |
| Есть готовый класс, но его интерфейс (названия методов) не совпадает с тем, который ожидает программа. | Adapter (Адаптер) |
| Нужно создавать объекты, но заранее не известно, какого именно типа они должны быть (тип определяется во время работы программы). | Factory Method (Фабричный метод) |
| В программе есть объект (например, кнопка или данные), за изменением которого должны следить другие части системы и реагировать на них. | Observer (Наблюдатель) |
| Если есть несколько способов решить задачу (например, разные методы сортировки или разные способы оплаты), и необходимо переключаться между ними «на лету». | Strategy (Стратегия) |
| Нужно добавить объекту новые обязанности (например, обернуть текст в HTML-теги или добавить шифрование), не меняя код самого объекта. | Decorator (Декоратор) |
| Сложная система состоит из множества подсистем, и вы хотите предоставить пользователю один простой метод (единую «точку входа») для работы с ними. | Facade (Фасад) |
| Объект должен менять свое поведение в зависимости от внутреннего состояния (например, заказ в интернет-магазине ведет себя по-разному в статусах «Новый», «Оплачен», «Доставлен»). | State (Состояние) |
| Процесс создания объекта очень сложный, состоит из множества шагов или требует передачи огромного количества параметров в конструктор. | Builder (Строитель) |
| Нужно совершить какое-то действие над группой объектов разных классов, не меняя код этих классов (например, экспорт данных в JSON для разных типов фигур). | Visitor (Посетитель) |
| Нужно превратить запрос или действие в отдельный объект, чтобы его можно было передавать как параметр, ставить в очередь или сохранять историю для отмены (Undo). | Command (Команда) |
Резюме:
- Если задача касается создания объекта — стоит выбрать паттерн в группе Порождающих (Singleton, Factory, Builder).
- Если нужно связать несовместимые части или упростить структуру — стоит выбрать паттерн в группе Структурные (Adapter, Facade, Decorator).
- Если нужно настроить взаимодействие и логику работы — стоит выбрать Поведенческие (Strategy, Observer, State).