Паттерны проектирования (Design Patterns) — это типичные решения часто встречающихся проблем в проектировании программного обеспечения. Они представляют собой готовые шаблоны, которые можно адаптировать для решения конкретных задач в разработке программного обеспечения. Паттерны не являются готовым кодом, а скорее описанием подхода к решению проблемы, который можно применить в различных ситуациях.
Паттерны проектирования были популяризированы книгой "Design Patterns: Elements of Reusable Object-Oriented Software" (Эрих Гамма, Ричард Хелм, Ральф Джонсон, Джон Влиссидес), которая вышла в 1994 году. В этой книге описаны 23 классических паттерна, которые делятся на три категории:
Абстрактная фабрика (Abstract Factory): Предоставляет интерфейс для создания семейств связанных или зависимых объектов без указания их конкретных классов.
Строитель (Builder): Позволяет создавать сложные объекты пошагово, используя один и тот же процесс строительства.
Фабричный метод (Factory Method): Определяет интерфейс для создания объекта, но оставляет подклассам решение о том, какой класс инстанцировать.
Прототип (Prototype): Позволяет копировать объекты, не вдаваясь в подробности их реализации.
Одиночка (Singleton): Гарантирует, что у класса есть только один экземпляр, и предоставляет глобальную точку доступа к этому экземпляру.
Адаптер (Adapter): Позволяет объектам с несовместимыми интерфейсами работать вместе.
Мост (Bridge): Разделяет абстракцию и реализацию так, чтобы они могли изменяться независимо.
Компоновщик (Composite): Позволяет сгруппировать объекты в древовидные структуры для работы с ними как с единым объектом.
Декоратор (Decorator): Динамически добавляет объекту новые обязанности, является гибкой альтернативой наследованию.
Фасад (Facade): Предоставляет простой интерфейс к сложной системе классов.
Приспособленец (Flyweight): Экономит память, разделяя состояние между множеством объектов.
Заместитель (Proxy): Позволяет подставлять вместо реальных объектов специальные объекты-заменители.
Цепочка обязанностей (Chain of Responsibility): Позволяет передавать запросы последовательно по цепочке обработчиков.
Команда (Command): Инкапсулирует запрос как объект, позволяя параметризировать клиентов с запросами.
Итератор (Iterator): Предоставляет способ последовательного доступа к элементам составного объекта, не раскрывая его внутреннего представления.
Посредник (Mediator): Упрощает взаимодействие между классами, уменьшая их зависимости друг от друга.
Хранитель (Memento): Позволяет сохранять и восстанавливать состояние объекта.
Наблюдатель (Observer): Определяет зависимость "один ко многим" между объектами так, чтобы при изменении состояния одного объекта все зависящие от него объекты уведомлялись и обновлялись автоматически.
Состояние (State): Позволяет объекту изменять свое поведение в зависимости от внутреннего состояния.
Стратегия (Strategy): озволяет выбирать алгоритм выполнения задачи во время выполнения программы.
Шаблонный метод (Template Method): Определяет скелет алгоритма, перекладывая ответственность за некоторые его шаги на подклассы.
Посетитель (Visitor): Позволяет добавлять новые операции к объектам без изменения их классов.