Приведен исходный код с объяснением работы и UML-диаграммами наиболее популярных паттернов.
- Поведенческие
- Цепочка ответственности (Chain of Responsibility)
- Команда (Command)
- Состояние (State)
- Стратегия (Strategy)
- Посетитель (Visitor)
- Порождающие
- Абстрактная фабрика (Abstract Factory);
- Строитель (Builder);
- Фабрика (Factory Method);
- Структурные
- Декоратор (Decorator)
Код не является 100% оригинальным, скорее, это адаптация разрозненных учебных материалов. Были взяты наиболее удачные примеры с точки зрения автора - лаконичные и понятные.
Источники вдохновения:
- https://javarush.com
- https://habr.com
- http://cpp-reference.ru/patterns
- https://www.baeldung.com/tag/design-pattern
- https://github.com/RefactoringGuru
Паттерны проектирования (шаблоны проектирования) ‒ это готовые к использованию решения часто возникающих в программировании задач. Это не класс и не библиотека, которую можно подключить к проекту, это нечто большее.
Паттерн проектирования, подходящий под задачу, реализуется в каждом конкретном случае.
- Ускоряют и облегчают написание кода.
- Позволяют не «изобретать велосипед», а воспользоваться готовым проверенным принципом.
- При грамотном использовании делают код более читаемым и эффективным.
- Упрощают взаимопонимание между разработчиками.
- Помогают избавиться от типовых ошибок.
- Не зависят от языка программирования и его особенностей.
- Позволяют реализовывать сложные задачи быстрее и проще.
- Использование паттернов ради паттернов, наоборот, усложняет код и запутывает разработчиков.
- Неправильное применение того или иного шаблона способно сделать программу менее эффективной.
- Паттерны неуниверсальны: в одной задаче конкретный паттерн подойдет, в другой нет.
- На ранних этапах изучения бывает сложно выбрать подходящий для конкретной проблемы паттерн.
- Из-за сильной связи с объектно-ориентированным программированием использование паттернов в других парадигмах ограничено. Хотя, например, в функциональном программировании они могут применяться — просто реализуются иначе.
- Порождающие. Такие шаблоны нужны, чтобы оптимизировать создание того или иного объекта. Порождающие паттерны помогают создавать объекты так, чтобы они эффективно общались с другими, и управлять их работой. Примеры: Фабрика, Прототип, Строитель, Одиночка.
- Структурные. Если порождающие паттерны отвечают за создание и взаимодействие объектов, то структурные ‒ за то, как эти объекты структурированы в коде. Они описывают, каким образом простые классы и объекты «собираются» в более сложные. Примеры: Декоратор, Мост, Фасад.
- Поведенческие. Это паттерны проектирования, которые описывают, как объекты себя ведут и взаимодействуют с другими. Их используют, например, для разделения обязанностей между разными сущностями или для реагирования на изменения без ошибок. Примеры: Итератор, Наблюдатель, Цепочка ответственности.