Н Е О К О Р Д

Блог

Паттерн — это упорядоченная и повторяющаяся система определённых элементов.

В музыке — это припев песни; в медицине — сердечный ритм; для преступника — 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.