Паттерны проектирования: для чего нужны, какими бывают и чем отличаются от архитектурных

Паттерны проектирования можно обсуждать бесконечно. Основное их назначение в том, что они помогают новичкам и опытным программистам экономить время при разработке, минимизировать количество ошибок и, в целом, выглядеть более грамотным при разговорах с коллегами :)

Поэтому вместе с преподавателями Академии мы запускаем серию статей о паттернах. В первой части материала разбираемся, что такое паттерны проектирования, какими бывают и чем отличаются от архитектурных паттернов.

Другие статьи серии: «Порождающие паттерны»«Структурные паттерны» и «Поведенческие паттерны».

ЧТО ТАКОЕ ПАТТЕРНЫ ПРОЕКТИРОВАНИЯ

Цельное представление о паттернах появилось в 1994 году после выхода нашумевшей книги «Приемы объектно-ориентированного программирования. Паттерны проектирования» от авторов, которых прозвали «Банда четырех».

В книге под паттерном понимается описание взаимодействия объектов и классов, адаптированных для решения общей задачи проектирования в конкретном контексте.

Проще говоря, паттерны проектирования — это решения распространенных проблем при разработке кода. Также они известны как шаблоны проектирования, паттерны объектно-ориентированного программирования или design patterns. В отличие от готовых функций или библиотек, паттерн представляет собой не конкретный код, а общую концепцию решения проблемы, которую еще нужно подстроить под задачи.

Зачем знать паттерны?

  • Проверенные решения. Вы тратите меньше времени, используя готовые решения, вместо изобретения велосипеда.
  • Стандартизация кода. Вы делаете меньше просчетов при разработке, используя типовые решения, так как все возможные проблемы в них уже найдены.
  • Общий программистский словарь. Вместо того, чтобы долго объяснять коллеге логику работы вашего кода, вы называете паттерн, который хотите использовать, и экономите свое и чужое время.

Какими бывают паттерны проектирования

Всего существует 23 классических паттерна, которые были описаны в книге «Банды четырех». В зависимости от того, какие задачи решают паттерны, они делятся на три вида — порождающие, структурные и поведенческие.

Порождающие предназначены для создания экземпляра объекта или группы связанных объектов. К ним относятся:

  • Abstract Factory — Абстрактная фабрика
  • Builder — Строитель
  • Factory Method — Фабричный метод
  • Prototype — Прототип
  • Singleton — Одиночка

Структурные в основном связаны с композицией объектов, с тем, как сущности могут использовать друг друга. К ним относятся:

  • Adapter — Адаптер
  • Bridge — Мост
  • Composite — Компоновщик
  • Decorator — Декоратор
  • Facade — Фасад
  • Flyweight — Приспособленец
  • Proxy — Заместитель

Поведенческие связаны с распределением обязанностей между объектами. Их отличие от структурных шаблонов заключается в том, что они описывают не только структуру, но и способы общения между ними. К ним относятся:

  • Chain of responsibility — Цепочка обязанностей
  • Command — Команда
  • Interpreter — Интерпретатор
  • Iterator — Итератор
  • Mediator — Посредник
  • Memento — Хранитель
  • Observer — Наблюдатель
  • State — Состояние
  • Strategy — Стратегия
  • Template method — Шаблонный метод
  • Visitor — Посетитель

Паттерны проектирования vs. архитектурные паттерны — в чем разница

Новички могут спутать паттерны проектирования и архитектурные паттерны, так как обычно в разговоре разработчики называют и те, и другие просто паттернами. Давайте разберемся, в чем отличия.

Паттерны проектирования предоставляют решения для доработки и построения подсистем на уровне кода. Обычно на их выбор влияет язык программирования, а разработчик сам принимает решение, какой паттерн использовать.

Архитектурные паттерны (архитектурные шаблоны, architectural patterns) рассматриваются на более высоком уровне. Они определяет архитектуру приложения, задают его логику (на какие компоненты/модули будет делиться приложение и каким образом они взаимодействуют) и помогают разработчику понять, как устроен продукт внутри. Выбор паттернов происходит на этапе создания продукта.

Про многие из архитектурных паттернов вы, скорее всего, уже слышали. Например, клиент-серверная архитектура, шина событий, MVC или интерпретатор. Подробнее про самые популярные паттерны можно прочитать в статье.

Заключение

Паттерны проектирования — это решения распространенных проблем при разработке кода. Их знание и использование позволяет экономить время, используя готовые решения, стандартизировать код и повысить общий программистский словарь.

Основное отличие паттернов проектирования от архитектурных в том, что первые предоставляют решения на уровне кода. Обычно на их выбор влияет язык программирования, а разработчик сам принимает решение, какой паттерн использовать. Архитектурные паттерны определяют архитектуру приложения, задают его логику и помогают разработчику понять, как устроен продукт внутри.

В зависимости от того, какие задачи решают паттерны проектирования, они делятся на три вида: порождающие, структурные и поведенческие. В следующих статьях мы подробнее расскажем про каждый вид и разберем 9 самых популярных паттернов, которыми чаще всего пользуются программисты.

Материалы для дополнительного изучения

«Паттерны объектно-ориентированного программирования» Э. Гамма, Р. Хелм, Р. Джонсон, Дж. Влиссидес — та самая книга от авторов «Банды четырех».

Refactoring.guru — Электронная книга о паттернах и принципах проектирования