Вы находитесь на странице: 1из 30

Шаблоны

[паттерны]
проектировани
я
Что такое паттерн проектирования?

Паттерн [шаблон] проектирования — это часто встречающееся


решение определённой проблемы при проектировании архитектуры
программ.

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


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

«Язык шаблонов. Города. Здания. «Приемы объектно-ориентированного


Строительство» проектирования. Паттерны проектирования»
Зачем надо знать паттерны?

Проверенные Стандартизаци Облегченная


решения я кода коммуникация
Классификация паттернов по уровню сложности,
детализации и охвату проектируемой системы

• Идиомы:
самые низкоуровневые и простые. Они не универсальны, поскольку
применимы только в рамках одного языка программирования.

• Архитектурные паттерны:
самые универсальные, доступны к реализации практически на любом
языке, нужны для проектирования всей программы, а не отдельных её
элементов.
Классификация паттернов по
предназначению

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

• Структурные паттерны: 
показывают различные способы построения связей между объектами.

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

Определяет общий интерфейс для создания объектов


в суперклассе, позволяя подклассам изменять тип
создаваемых объектов. Хорош, когда:
• заранее неизвестны типы и зависимости объектов,
с которыми должен работать ваш код;
• вы хотите дать возможность пользователям
расширять части вашего фреймворка или
библиотеки;
• вы хотите экономить системные ресурсы,
повторно используя уже созданные объекты,
вместо порождения новых.
Абстрактная фабрика
Abstract Factory

Позволяет создавать семейства связанных


объектов, не привязываясь к конкретным классам
создаваемых объектов. Хорош, когда:
• бизнес-логика программы должна работать с
разными видами связанных друг с другом
продуктов, не завися от конкретных классов
продуктов;
• в программе уже используется Фабричный
метод, но очередные изменения предполагают
введение новых типов продуктов.
Строитель
Builder

Позволяет создавать сложные объекты пошагово.


Строитель даёт возможность использовать один и
тот же код строительства для получения разных
представлений объектов.
Хорош, когда:
• вы хотите избавиться от «телескопического
конструктора»;
• ваш код должен создавать разные представления
какого-то объекта. Например, деревянные и
железобетонные дома;
• вам нужно собирать сложные составные объекты.
Прототип
Клон,  Prototype

Позволяет копировать объекты, не


вдаваясь в подробности их реализации.
Хорош, когда:
• ваш код не должен зависеть от классов
копируемых объектов;
• вы имеете много подклассов, которые
отличаются начальными значениями
полей.
Одиночка
Singleton

Гарантирует, что у класса есть только один


экземпляр, и предоставляет к нему
глобальную точку доступа. Применяется,
когда:
• в программе должен быть единственный
экземпляр какого-то класса, доступный
всем клиентам (например, общий доступ
к базе данных из разных частей
программы);
• вам хочется иметь больше контроля над
глобальными переменными.
Структурные
шаблоны
проектирования
Отвечают за построение
удобных в поддержке
иерархий классов
Адаптер
Wrapper,  Обёртка,  Adapter

Позволяет объектам с несовместимыми


интерфейсами работать вместе.
Хорош, когда:
• вы хотите использовать сторонний класс, но
его интерфейс не соответствует остальному
коду приложения
• когда вам нужно использовать несколько
существующих подклассов, но в них не
хватает какой-то общей функциональности,
причём расширить суперкласс вы не можете.
Мост
Bridge

Разделяет один или несколько классов на две


отдельные иерархии — абстракцию и реализацию,
позволяя изменять их независимо друг от друга.
Применяется, когда:
• вы хотите разделить монолитный класс, который
содержит несколько различных реализаций какой-
то функциональности
• класс нужно расширять в двух независимых
плоскостях.
• вы хотите, чтобы реализацию можно было бы
изменять во время выполнения программы.
Компоновщик
Дерево,  Composite

Позволяет сгруппировать множество


объектов в древовидную структуру, а затем
работать с ней так, как будто это единичный
объект.
Применяется, когда:
• вам нужно представить древовидную
структуру объектов;
• клиенты должны единообразно трактовать
простые и составные объекты.
Фасад Заместитель
Facade Proxy

Предоставляет простой интерфейс к сложной


Позволяет подставлять вместо реальных
системе классов, библиотеке или фреймворку.
объектов специальные объекты-заменители. Эти
Применяется, когда: объекты перехватывают вызовы к
оригинальному объекту, позволяя сделать что-
• вам нужно то до или после передачи вызова оригиналу.
представить простой
Применятся в случаях работы с сетевым
или урезанный
соединением, с огромным объектом в памяти
интерфейс к сложной
подсистеме; (или на диске) или с любым другим ресурсом,
который сложно или тяжело копировать. Или
• вы хотите разложить когда в программе есть разные типы
подсистему на пользователей, и вам хочется защищать объект
отдельные слои. от неавторизованного доступа.
Декоратор
Wrapper,  Обёртка,  Decorator

Позволяет динамически добавлять


объектам новую функциональность,
оборачивая их в полезные «обёртки».
Применим, когда:
• вам нужно добавлять обязанности
объектам на лету, незаметно для кода,
который их использует;
• нельзя расширить обязанности
объекта с помощью наследования.
Легковес
Приспособленец,  Кэш,  Flyweight

Позволяет вместить большее


количество объектов в отведённую
оперативную память.
Применяется, когда не хватает
оперативной памяти для
поддержки всех нужных объектов.
Поведенческие
шаблоны
проектирования
Решают задачи эффективного
и безопасного
взаимодействия между
объектами программы.
Команда
Транзакция,  Action,  Command

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

Даёт возможность последовательно Позволяет уменьшить связанность


обходить элементы составных объектов, не множества классов между собой, благодаря
раскрывая их внутреннего представления. перемещению этих связей в один класс-
посредник.
Шаблонный
метод
Template Method
Определяет скелет алгоритма,
перекладывая ответственность
за некоторые его шаги на
подклассы. Паттерн позволяет
подклассам переопределять
шаги алгоритма, не меняя его
общей структуры.
Снимок Наблюдатель
Memento

Позволяет сохранять и восстанавливать Создаёт механизм подписки, позволяющий


прошлые состояния объектов, не раскрывая одним объектам следить и реагировать на
подробностей их реализации. события, происходящие в других объектах.
Применим, когда:
• вам нужно сохранять мгновенные снимки
состояния объекта (или его части), чтобы
впоследствии объект можно было
восстановить в том же состоянии;
• прямое получение состояния объекта
раскрывает приватные детали его
реализации, нарушая инкапсуляцию.
Состояние
State

Позволяет объектам менять


поведение в зависимости от
своего состояния. Извне
создаётся впечатление, что
изменился класс объекта.
Стратегия
Strategy

Определяет семейство схожих алгоритмов и


помещает каждый из них в собственный класс,
после чего алгоритмы можно взаимозаменять
прямо во время исполнения программы.
Применим, когда:
• вы не хотите обнажать детали реализации
алгоритмов для других классов;
• у вас есть множество похожих классов,
отличающихся только некоторым
поведением;
• нужно использовать разные вариации
какого-то алгоритма внутри одного объекта.
Посетитель
Visitor
Позволяет добавлять в
программу новые операции,
не изменяя классы объектов,
над которыми эти операции
могут выполняться.
Критика паттернов

Костыли для слабого языка Неэффективные


программирования  решения

Неоправданное применение
Спасибо за внимание!