Введение в паттерны проектирования программного обеспечения

Пол Кнульст в Программирование — Aug 27, 2022 — 7 min read


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

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

Почему вы должны использовать паттерны проектирования?

Использование паттернов проектирования при разработке программного обеспечения имеет ряд преимуществ:

  • Это проверенные решения: Паттерны проектирования часто используются самыми разными разработчиками, поэтому вы можете быть уверены, что они работают так, как задумано. Более того, вы можете быть уверены, что они были пересмотрены несколько раз, и оптимизация уже произошла.
  • Их легко использовать повторно: Модели проектирования документируют многоразовое решение, которое может быть изменено для решения множества конкретных задач, поскольку они не привязаны к конкретной проблеме.
  • Они выразительны: Большие решения могут быть элегантно объяснены с помощью паттернов проектирования.
  • Они облегчают коммуникацию: Многие разработчики знакомы с паттернами проектирования и легко используют их для общения друг с другом о возможных решениях поставленных задач.
  • Они предотвращают необходимость рефакторинга кода: Часто, если вы используете паттерны проектирования при разработке программного обеспечения, вы можете избежать его последующего рефакторинга. Это применимо только в том случае, если вы используете правильный паттерн для данной проблемы, поскольку он уже описывает оптимальное решение.  
  • Они уменьшают размер кодовой базы: Поскольку паттерны проектирования обычно представляют собой элегантные, оптимизированные и хорошо документированные решения, они требуют меньше кода, чем другие решения.

С чего все начиналось

В 1994 году вышла культовая книга по информатике «Паттерны проектирования: Элементы многократно используемого объектно-ориентированного программного обеспечения» была впервые опубликована четырьмя авторами: Эрихом Гамма, Ричардом Хелмом, Ральфом Джонсоном и Джоном Влиссидесом. В технологических кругах вы часто можете увидеть этих авторов под названием «Банда четырех» или сокращенно GoF.

Хотя «банда четырех» написала книгу в контексте C++, она по-прежнему остается очень актуальной для Java, JavaScript, Python или любого другого объектно-ориентированного языка программирования. Авторы, благодаря своему опыту создания крупномасштабных корпоративных систем с использованием C++, увидели 23 общих паттерна. Эти 23 паттерна проектирования не являются уникальными для C++, но могут быть применены в любом другом языке.

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

23 шаблона проектирования GoF

Все 23 паттерна проектирования, представленные Группой четырех

23 паттерна проектирования Gang of Four делятся на три категории:

  1. Creational: Для работы с механизмами создания объектов. Они используются для создания объектов, вместо того чтобы непосредственно инстанцировать объекты. Ваша программа будет более гибкой в принятии решения о том, какой объект она создаст для конкретного случая использования.
  2. Структурные: Для определения способов реализации отношений между объектами. Это касается композиции классов/объектов с наследованием для определения различных способов получения новой функциональности.
  3. Поведенческий: Для обработки взаимодействия между различными объектами.

Креативный

Существует 5 паттернов проектирования в категории креативных, разработанных «бандой четырех».

1. Абстрактная фабрика: Создает экземпляр нескольких семейств классов без детализации конкретных классов. Позволяет создавать фабрику для фабричных классов.

2. Конструктор: Отделяет конструирование объекта от его представления и всегда создает объект одного типа. Он создает объект шаг за шагом и метод для окончательного получения экземпляра объекта.

3. Фабричный метод: Переносит ответственность за инстанцирование объекта с класса на фабрику. Затем фабрика создает экземпляр нескольких производных классов на основе взаимосвязанных данных или событий.

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

5. Синглтон: Ограничивает инициализацию класса, чтобы гарантировать, что может быть создан только один экземпляр класса. Многократные попытки инициализации приведут к возвращению одного и того же объекта снова и снова.

Структурный

Существует 7 паттернов проектирования в категории структурных, разработанных «бандой четырех».

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

2. Мост: Определяет стратегию отделения интерфейсов от реализации и скрывает детали реализации от клиентской программы. Таким образом, оба интерфейса могут изменяться независимо друг от друга. Он использует инкапсуляцию, агрегирование и наследование для разделения обязанностей на несколько классов.

3. Композитный: Этот паттерн используется, если необходимо реализовать иерархию «часть-целое». Он создает группу объектов, которые должны рассматриваться одинаково, как один экземпляр одного объекта. Он объединяет ноль или более объектов таким образом, чтобы ими можно было манипулировать как одним единственным объектом.

4. Декоратор: Используется для изменения поведения объектов во время выполнения. Он динамически добавляет альтернативную обработку к объектам, не затрагивая другие объекты того же класса.

5. Фасад: Предоставляет унифицированный интерфейс к набору интерфейсов в подсистеме. Определяет более высокий уровень, который помогает легче использовать подсистему. Он маскирует лежащий в основе сложный или структурный код и служит «интерфейсом перед глазами».

6. Flyweight: Описывает мелкозернистый экземпляр, используемый для эффективного обмена информацией. Он кэширует и повторно использует экземпляры объектов, используется с неизменяемыми объектами для минимизации использования памяти.

7. Прокси: Предоставляет место для другого объекта. Его следует использовать для контроля доступа, снижения стоимости и уменьшения сложности.

Поведенческий

Существует 11 шаблонов проектирования в категории поведенческих, разработанных «бандой четырех».

1. Цепочка ответственности: Описывает технику делегирования команд или передачи запросов между цепочкой объектов, чтобы найти объект, который может обработать команду или запрос.

2. Команда: Этот шаблон инкапсулирует командный запрос как объект для включения, регистрации и/или постановки запросов в очередь. Кроме того, он обеспечивает обработку ошибок для необработанных командных запросов,

3. Интерпретатор: Включает в приложение элементы, специфичные для конкретного языка, чтобы соответствовать грамматике предполагаемого языка. Он определяет грамматическое представление языка и интерпретатор, который работает с этой грамматикой.

4. Итератор: Описывает стандартизированный способ перехода по группе объектов. Он осуществляет последовательный доступ к содержащим объектам, не раскрывая их базового представления.

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

6. Memento: Хранит состояние объекта каждый раз, когда он сохраняется, чтобы можно было восстановить предыдущие состояния, предоставляя операции отмены.

7. Наблюдатель: Сообщает об изменениях состояния множеству классов-подписчиков для обеспечения согласованности между ними.

8. Состояние: Обеспечивает изменение поведения на основе внутреннего состояния объекта. Если состояние объекта меняется, то меняется и его реакция на запросы.

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

10. Шаблонный метод: Определяет абстрактный скелет алгоритма таким образом, что подклассы должны реализовать конкретное поведение.

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

Заключение

Теперь, когда вы прочитали это краткое введение в паттерны проектирования программного обеспечения, вы должны иметь представление о нескольких важных приемах, используемых почти в каждом языке программирования.

Теперь вам следует отточить свои навыки, внедрив все или хотя бы некоторые из этих паттернов проектирования в свои побочные проекты или просто в качестве практики. Кроме того, вы можете начать обдумывать, как применить их в своих реальных проектах.

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

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

Учитывая это, наиболее важным предостережением является обеспечение полного понимания разработчиком того, как и почему используется каждый паттерн проектирования.


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

Эта статья была первоначально опубликована в моем собственном блоге: https://www.knulst.de/an-introduction-to-software-design-patterns/.

Не стесняйтесь общаться со мной на моем личном блоге, Medium, LinkedIn, Twitter и GitHub.


Вы нашли мою статью ценной? Хотите поддержать меня? (… и поддержать разработку нынешних и будущих учебников!). Вы можете поддержать меня на Buy Me a Coffee или Ko-Fi. Кроме того, вы можете подписаться на мою бесплатную рассылку. Или загляните на мою страницу вклада, чтобы узнать обо всех (бесплатных или платных) способах выразить свою благодарность!

Оцените статью
devanswers.ru
Добавить комментарий