В статье рассказывается:
- Что такое паттерн проектирования
- Отличие паттернов проектирования от схожих инструментов
- Основные виды паттернов проектирования
- Выбор подходящего паттерна проектирования
-
Пройди тест и узнай, какая сфера тебе подходит:
айти, дизайн или маркетинг.Бесплатно от Geekbrains
Паттерны проектирования необходимы для быстрого решения типовых задач в программировании. В процессе разработки постоянно встречаются одни и те же проблемы, и программисту нет нужды каждый раз с нуля изобретать оптимальное решение, когда он может воспользоваться готовым шаблоном (паттерном).
Однако вопрос выбора того или иного типового подхода остается за самим разработчиком. В нашей статье мы расскажем, какие бывают паттерны проектирования, чем они отличаются от похожих инструментов и как выбрать тот, который необходим.
Что такое паттерн проектирования
Термин «design patterns» можно перевести с английского как паттерны/шаблоны/образцы проектирования. Они применяются в процессе создания информационных систем и являются формализованными описаниями регулярно возникающих задач проектирования, эффективными решениями таких задач и рекомендациями по использованию полученных решений в тех или иных ситуациях.
Стоит отметить, что адекватное моделирование рассматриваемой предметной области выступает в качестве важнейшей начальной стадии в процессе работы с паттернами. Данный этап нужен не только для правильной (грамотно формализованной) постановки задачи, но и для определения подходящих паттернов.
Примером научного исследования, в котором описываются ключевые моменты построения модели анализа и модели проектирования, является работа Крэга Лармана — «Применение UML и паттернов проектирования».
входят в ТОП-30 с доходом
от 210 000 ₽/мес
Скачивайте и используйте уже сегодня:
Топ-30 самых востребованных и высокооплачиваемых профессий 2023
Поможет разобраться в актуальной ситуации на рынке труда
Подборка 50+ бесплатных нейросетей для упрощения работы и увеличения заработка
Только проверенные нейросети с доступом из России и свободным использованием
ТОП-100 площадок для поиска работы от GeekBrains
Список проверенных ресурсов реальных вакансий с доходом от 210 000 ₽
Правильно применяя паттерны проектирования, разработчик получает массу преимуществ. Например, построенная с помощью паттернов модель будет менее сложна и более наглядна в изучении, относительно обычных моделей. Кроме того, она будет представлять собой структурированное выделение важных для решения задачи элементов. Вместе с тем, полученная модель позволит на глубочайшем уровне проработать архитектуру создаваемой системы при помощи специального языка.
Использования паттернов проектирования делает систему более устойчивой к смене требований. При этом дальнейшая доработка системы становится гораздо проще. Применение паттернов очень полезно и при интеграции информационных систем организации.
Комплекс паттернов проектирования можно смело назвать словарем разработчика. Это универсальное средство, позволяющее налаживать коммуникацию в процессе работы.
Отличие паттернов проектирования от схожих инструментов
Существует три основные разновидности паттернов:
- архитектурные паттерны;
- паттерны проектирования;
- идиомы.
К первой категории относятся паттерны, которые представляют собой шаблоны высшего уровня. Они описывают структурную схему программной системы в целом. В этой схеме располагаются отдельные функциональные составляющие системы (подсистемы) и определяются отношения между ними.
В качестве примера архитектурного паттерна можно взять популярную программную парадигму «модель-представление-контроллер» (model-view-controller — MVC). При этом подсистемы содержат в себе архитектурные единицы более низкого уровня.
Вторая категория — паттерны проектирования. Они описывают схемы детализации программных подсистем и их отношений между собой. Такие паттерны никак не влияют на структуру программной системы в целом и не зависят от использования языка программирования.
Ярким примером являются паттерны GoF. Паттерны проектирования объектно-ориентированных систем — это описание взаимодействия объектов и классов, которые адаптированы для решения основной задачи проектирования в определенном контексте.
Идиомы представляют собой паттерны низкого уровня. Их предметная область — реализация той или иной проблемы с учётом специфики соответствующего языка программирования. Вид идиомы может быть различен в зависимости от того, к какому языку она применяется. В некоторых случаях идиома и вовсе не будет иметь никакого смысла.
Как правило, чтобы применять идиомы необходимо очень хорошо разбираться в нюансах выбранного языка. Стоит упомянуть, что в области программирования есть ещё несколько разновидностей паттернов, которые никак не связаны с проектированием. К примеру, шаблоны анализа, тестирования, документирования и т.д.
Основные виды паттернов проектирования
Можно выделить три типа шаблонов: порождающие, структурные и поведенческие. Перечислим основные паттерны проектирования для каждого из них.
Порождающие (Creational)
Данные паттерны выделяют процесс инстанцирования. С помощью них система перестает зависеть от метода формирования композиции и представления объектов.
- Прототип (Prototype). Такой шаблон задаёт типы создаваемых объектов посредством экземпляра-прототипа. Более того, копируя прототип, паттерн формирует новые объекты. При использовании этого шаблона вы сможете отойти от реализации и придерживаться принципа «программирование через интерфейсы». В роли возвращающего типа выступает указанный интерфейс/абстрактный класс на вершине иерархии. При этом классы-наследники могут подставить в это место наследника, выполняющего реализацию данного типа. Иными словами, прототип позволяет создать объект посредством клонирования, а не с помощью конструктора.
- Factory (Фабрика). Это не считается паттерном в строгом смысле слова. Правильнее будет обозначить Factory как подход, в рамках которого логика создания объектов выносится в отдельный класс.
- Фабричный метод (Factory Method). Шаблон, который определят общий интерфейс для формирования объектов в суперклассе. Данный метод даёт подклассам возможность изменять вид создаваемых объектов.
- Абстрактная фабрика (Abstract factory). Это порождающий паттерн проектирования, который предоставляет интерфейс для создания семейств взаимосвязанных или взаимозависимых объектов, без непосредственной спецификации их конкретных классов. Реализация такого шаблона обеспечивается за счёт создания абстрактного класса Factory. Этот класс выступает в качестве интерфейса для создания компонентов системы (скажем, применительно к оконному интерфейсу он может формировать окна и кнопки). После всего этого пишутся классы, которые реализуют данный интерфейс.
Читайте также!
Фреймворк: особенности, преимущества, архитектураПодробнее - Одиночка (Singleton). Очередной порождающий паттерн. С помощью него обеспечивается наличие единственного экземпляра класса с глобальной точкой доступа в однопоточном приложении.
- Строитель (Builder). Полезный порождающий паттерн, который, по сути, является методом создания составного объекта. Он дифференцирует сложный объект на конструирование и представление. Благодаря этому при выполнении одной и той же операции конструирования вы можете получить разные представления.
Структурные (Structural)
Такие шаблоны определяют всевозможные структуры высокого уровня сложности, которые вносят изменения в интерфейс уже созданных объектов или его реализацию. Это позволяет упростить процесс разработки и сделать программу более оптимизированной.
Шаблоны, входящие в эту разновидность, облегчают проектирование за счёт того, что они выявляют простейший метод реализации отношений между субъектами.
- Мост (Bridge). Применяется в проектировании ПО. Он разделяет абстракцию и реализацию таким образом, чтобы они могли меняться независимо. Данный паттерн работает с помощью инкапсуляции, агрегирования и может применять наследование в целях распределения межклассовой ответственности.
- Декоратор (Decorator). Данный шаблон был сформирован для динамического подключения дополнительного поведения к объекту. С его помощью практика создания подклассов получает гибкую альтернативу. Это позволяет сделать функционал более широким.
- Адаптер (Adapter). Он необходим для организации применения функций объекта, который нельзя модифицировать, посредством специального интерфейса.
- Компоновщик (Composite pattern). Такой шаблон способен объединять объекты в древовидную структуру. Это полезно для представления иерархии от частного к целому. Тем самым Composite pattern даёт клиентам возможность обращаться к отдельным объектам и к группам объектов одинаковым образом.
- Заместитель (Proxy). Он предоставляет объект, контролирующий доступ к другому объекту, перехватывая при этом все вызовы. Иными словами, он выступает в качестве контейнера Фасад (Facade). Он помогает скрыть сложность системы. Принцип работы довольно прост: все возможные внешние вызовы сводятся к одному и тому же объекту, который передаёт эти вызовы соответствующим объектам системы.
- Приспособленец (Flyweight, «легковесный (элемент)»). В процессе применения данного паттерна объект представляет себя как уникальный экземпляр в разных частях программы, однако, на самом деле это не так.
Поведенческие (behavioral)
Такие паттерны определяют алгоритмы и методы реализации взаимодействия каких-либо объектов и классов. Они выявляют общие закономерности связей между объектами, которые реализуют данные шаблоны. Использование поведенческих паттернов позволяет снизить уровень связности системы и упростить взаимодействие между объектами. Это позволяет сделать программный продукт более гибким.
- Итератор (iterator). Это интерфейс, который даёт доступ к элементам коллекции (массива или контейнера), а также навигацию по ним. В зависимости от конкретной системы итераторы носят разные названия. Если говорить о системах управления, то это курсоры.
- Интерпретатор (Interpreter). Он решает одну очень известную, но постоянно меняющуюся задачу. Альтернативное название — Little (Small) Language.
- Цепочка обязанностей (Chain of responsibility). Такой шаблон нужен для организации уровней ответственности в системе.
- Хранитель (Memento). С его помощью можно выполнить закрепление и сохранение внутреннего состояния объекта без нарушения инкапсуляции. Это нужно для того, чтобы в последующем можно было восстановить его в это самое состояние.
- Команда (Command). Он представляет действие и применяется в рамках объектно-ориентированного программирования. Объект команды содержит в себе как само действие, так и его параметры.
- Посредник (Mediator). Данный паттерн проектирования позволяет обеспечить взаимодействие нескольких объектов. В процессе этого создаётся слабая связанность и объекты избавляются от потребности в явных ссылках друг на друга.
Читайте также!
Как работает рекурсия в программированииПодробнее - Состояние (State). Применяется в ситуациях, когда в процессе выполнения программы объект должен изменять свое поведение, в зависимости от того, в каком состоянии он находится.
- Наблюдатель (Observer). Его также называют «подчинённые» (Dependents). Формирует особый механизм у класса, который даёт возможность экземпляру объекта этого класса получать уведомления от остальных объектов. В оповещения содержится информация об изменении их состояния. Таким образом, происходит наблюдение за объектом.
- Посетитель (visitor). Отвечает за описание операции, которая выполняется над объектами остальных классов. Если внести изменения в visitor, то вам не придётся корректировать обслуживаемые классы.
- Стратегия (Strategy). Этот шаблон необходим для того, чтобы определять семейства алгоритмов и инкапсуляции каждого из них. Кроме того, данный паттерн позволяет обеспечить их взаимозаменяемость. Благодаря этому появляется возможность подбора алгоритма посредством определения соответствующего класса. С помощью Strategy можно изменять применяемый алгоритм вне зависимости от использующих его объектов-клиентов.
- Шаблонный метод (Template method). Определяет «фундамент» алгоритма и даёт наследникам возможность переопределять те или иные шаги алгоритма, оставляя его общую структуру нетронутой.
Выбор подходящего паттерна проектирования
До того как вы совершите выбор шаблона, нужно определить применимые сущности и выявить связи между ними. Затем необходимо выполнить абстрагирование этих сущностей от конкретной ситуации. В результате вы получите абстрактную форму, на которую нужно обратить пристальное внимание. Вы должны понять, подходит ли она под какой-либо паттерн.
Допустим, что перед вами стоит задача создания новых объектов. В таком случае присмотритесь к порождающим паттернам. Иными словами, вы должны взять некоторое количество родственных паттернов из подходящей категории, а затем понять, какой из вариантов является оптимальным.
на курсы от GeekBrains до 08 декабря
Таким образом, разработчик должен хорошо понимать абстрактную организацию паттерна и все его конкретные реализации, так как в некоторых случаях они различаются для одного и того же шаблона. Чем больше вы будете работать с теми или иными реализациями, тем глубже сможете понять смысл конкретного шаблона. Однако если вы не можете с ним разобраться, то лучше отказаться от применения. Это касается даже тех ситуаций, когда создаётся впечатление, будто он является крайне полезным для вас.
В заголовке «как выбрать нужный», а по итогу о том как выбирать, написан 2 абзаца