В музыке — это припев песни; в медицине — сердечный ритм; для преступника — modus operandi, или метод действий; в графике — повторяющиеся элементы дизайна (как арабская вязь в исламской культуре), а в математике…
Формулы в математике (и физике) тоже являются своеобразным паттерном, в который можно подставить разнообразие жизни — от яблок, складываемых в первом классе, до процессов квантового мира.
Математику однажды дали задачу: есть вода, плита, спички и чайник. Нужно вскипятить воду. Математик даёт стандартное решение: налить воду в чайник, зажечь плиту, поставить чайник на огонь.
Затем задаётся вторая задача: всё то же самое, но плита уже горит. Математик отвечает, что нужно потушить огонь и вернуться к уже решённой задаче. Иными словами — вернуться к паттерну.
Математика, а точнее булева алгебра, стала основой для развития всего мира программирования.
Преимущества использования паттернов в программировании:
- Ускоряют процесс написания кода
- Помогают избежать ошибок из-за небрежности или случайности, поскольку используется стандартный набор кода
- Упрощают понимание кода для стороннего разработчика, знакомого с паттернами
Недостатки:
- Паттерн может увеличить объём кода; в истории про математика пришлось выполнить дополнительную операцию.
Основные группы паттернов:
- Порождающие — шаблоны, организующие создание объектов
- Структурные — шаблоны, объединяющие объекты и их классы в структуры
- Поведенческие — организуют взаимодействие с внешними объектами относительно нашей системы
Порождающие паттерны:
Применяются, когда нужно создавать объекты одной группы, но решающие разные задачи. Например, программа банк-клиент предоставляет личный кабинет для представителя банка, администратора, директора компании и бухгалтера. У каждого разная функциональность, но цель одна — личный кабинет.
Виды порождающих паттернов:
Одиночка (Singleton) — создаёт объект или группу объектов и предоставляет к ним доступ
Строитель (Builder) — реализует метод создания составного объекта, абстрагируясь от природы объектов.
Прототип (Prototype) — определяет виды создаваемых объектов с помощью экземпляра-прототипа и создаёт новые объекты путём копирования этого прототипа.
Фабричный метод (Factory Method) — позволяет подклассам объектов создавать класс более высокого уровня.
Абстрактная фабрика (Abstract factory) — предоставляет интерфейс для создания семейств объектов без указания их конкретных классов.
Пул объектов (Object pool) — набор готовых к использованию объектов. Когда системе нужен объект, он берётся из пула, а не создаётся заново.
Структурные паттерны:
Объединяют системы в более сложные структуры и поддерживают иерархии классов. Например, если нужно подключить к системе несколько несовместимых плагинов, структурный паттерн решает эту задачу.
Виды структурных паттернов:
Декоратор (Decorator) — динамически добавляет объектам новую функциональность, расширяя их возможности.
Фасад (Facade) — предоставляет простой интерфейс для сложной системы классов, библиотеки или фреймворка.
Мост (Bridge) — разделяет один или несколько классов на две отдельные иерархии — абстракцию и реализацию, позволяя им развиваться независимо.
Адаптер (Adapter) — позволяет несовместимым интерфейсам работать вместе.
Компоновщик (Composite) — группирует несколько объектов в древовидную структуру и работает с ней как с единым объектом.
Заместитель (Proxy) — перехватывает доступ к объекту, позволяя обработать запрос перед передачей оригиналу.
Приспособленец (Flyweight) — минимизирует использование памяти путём совместного использования как можно большего объёма данных.
Поведенческие паттерны:
Определяют алгоритмы взаимодействия между различными объектами, группами и классами. Они структурируют взаимодействие объектов, упрощая поддержку и модификацию.
Виды поведенческих паттернов:
Наблюдатель (Observer) — устанавливает зависимость между объектами так, что при изменении состояния одного все зависимые объекты автоматически уведомляются и обновляются.
Состояние (State) — позволяет объекту менять поведение при изменении внутреннего состояния.
Стратегия (Strategy) — определяет набор алгоритмов, которые можно выбирать во время выполнения; код выбирает подходящий алгоритм на основе переданной команды.
Команда (Command) — инкапсулирует информацию внутри объекта, защищая её от возможных изменений.
Цепочка ответственности (Chain of Responsibility) — создаёт цепочку из источника командных объектов и группы обрабатывающих объектов. Обрабатывающий объект может обработать запрос по своему алгоритму или передать его следующему объекту в цепочке.
Цель этой статьи — привлечь внимание к использованию паттернов в коде и стать агрегатором для более подробных статей по теме.
Перейдя по ссылкам, вы можете изучить примеры кода для каждого паттерна, упомянутого в статье.
Для более детального изучения рекомендуются следующие книги:
Эрих Гамма, Ричард Хелм, Ральф Джонсон, Джон Влиссидес (1994) Паттерны проектирования: элементы объектно-ориентированного программного обеспечения многократного использования
Freeman, Eric T.; Robson, Elisabeth; Bates, Bert; Sierra, Kathy (2004). Head First Design Patterns.
Hohpe, Gregor; Woolf, Bobby (2003). Enterprise Integration Patterns: Designing, Building, and Deploying Messaging Solutions.