Slide 1

Slide 1 text

17 мая 2022 [email protected] Олисеенко Валерий Дмитриевич Ассистент кафедры информатики Паттерны проектирования

Slide 2

Slide 2 text

2/13 2/13 Что это? Паттерн проектирования — архитектурная конструкция, позволяющая решать схожие проблемы в “проектировании”. Чем паттерн проектирования отличается от алгоритма?

Slide 3

Slide 3 text

3/13 3/13 Составляющее паттернов • Описание проблемы • Мотивация предлагаемого решения • Описание и структура классов • Пример применения (код) • Связи с другими паттернами

Slide 4

Slide 4 text

4/13 4/13 История паттернов • Александер К., Исикава С., Силверстайн М. Язык шаблонов: города, здания, строительство. – Москва: Изд-во Студии Артемия Лебедева, 2014. – 1093 с. • Гамма Э., Хелм Р., Джонсон Р., Влиссидес Д. Приемы объектно-ориентированного проектирования. Паттерны проектирования.– 2007. [23 паттерна, GoF book]

Slide 5

Slide 5 text

5/13 5/13 Зачем нужны паттерны? • Стандартизация кода • Проверенные решения • Создание понятной архитектуры Критика: • Костыли для слабого языка • Неэффективные решения («как в книжке») • Неправильное применение (Золотой молоток)

Slide 6

Slide 6 text

6/13 6/13 Классификация паттернов • Порождающие паттерны (гибкое создание объектов) • Структурные паттерны (способы связи между объектами) • Поведенческие паттерны (коммуникация между объектами) Основная цель изучения паттернов — понять зачем и как применять

Slide 7

Slide 7 text

7/13 7/13 Синглтон (порождающий паттерн) Суть: паттерн гарантирует, что у класса есть только один экземпляр и глобальная точка доступа Проблема: - Нужен постоянный объект при обращении к классу - Нужна глобальная «защищенная» (от перезаписи) точка доступа Решение: скрыть конструктор класса и реализовать static-метод для управления классом

Slide 8

Slide 8 text

8/13 8/13 Синглтон Мотивация: • В программе нужен один экземпляр класса • Когда нужен контроль над глобальными переменными Плюсы и минусы: + Гарантирует наличие одного экземпляра класса + Даёт глобальную точку доступа + Отложенная инициализация – Нарушение принципов ООП – Может маскировать плохой дизайн программы – Проблемы с многопоточностью https://bool.dev/blog/detail/pattern-singleton

Slide 9

Slide 9 text

9/13 9/13 Синглтон алгоритм 1) Добавить в класс приватное статическое поле, которое будет содержать одиночный объект 2) Объявить статический метод для создания одиночки (getInstance()) 3) Добавить в статический метод (getInstance()) создание объекта при первом вызове метода 4) Создать приватный конструктор 5) Заменить вызовы конструктора одиночка вызовами его создающего метода

Slide 10

Slide 10 text

10/13 10/13 Мост (структурный паттерн) Суть: разделить классы на абстракцию и реализацию Проблема: - Фигур Решение: замена наследования агрегацией или композицией (фигура->цвет или GUI+API)

Slide 11

Slide 11 text

11/13 11/13 Мост Мотивация: • Разделить класс, который содержит несколько реализаций одной функциональности • Когда класс нужно расширять в двух независимых плоскостях • Когда необходимо изменять во время выполнения программы Плюсы и минусы: + Возможность построения кросс-платформенные программы + Возможность скрыть детали клиентского кода – Сильно усложняет код программы

Slide 12

Slide 12 text

12/13 12/13 Мост алгоритм 1) Определить по какому измерению можно разделить класс 2) Выделить и описать абстракцию (базовый класс, «фигура») 3) Выделить часть, необходимую абстракции — реализация (общий интерфейс, «цвет фигуры») 4) Под каждую задачу опишите конкретную реализацию (красный цвет, черный цвет и т.д.) 5) Добавьте в класс абстракции ссылку на объект реализации 6) Если у вас есть несколько вариаций абстракции, создайте для каждой из них свой подкласс 7) Подать объект реализации в конструктор абстракции, чтобы связать их воедино. Использовать объект абстракции

Slide 13

Slide 13 text

13/13 13/13 Снимок (поведенческий паттерн) Суть: сохранить и восстановить состояния объектов Проблема: • создание и откат истории файла • приватность • изменение кода классов копирования Решение: поручить создание копии состояния объекта самому объекту, который этим состоянием владеет

Slide 14

Slide 14 text

14/13 14/13 Снимок Мотивация: • Когда нужно сохранить состояние объекта • Когда прямое получение состояния объекта раскрывает приватные детали его реализации, нарушая инкапсуляцию Плюсы и минусы: + Не нарушает инкапсуляции исходного объекта + Исходному объекту не надо хранить свою историю – Требует много памяти – Сложно гарантировать приватность (Python, JS, PHP и др.)

Slide 15

Slide 15 text

15/13 15/13 Снимок алгоритм 1) Определить класс создателя 2) Создайте класс снимка и опишите поля как у создателя 3) Защитите объект снимка от изменений 4) Сделайте класс снимка вложенным в класс создателя (или создайте интерфейс) 5) Добавьте в класс создателя метод получения снимков 6) Добавьте в класс создателя метод восстановления из снимка

Slide 16

Slide 16 text

16/13 16/13 Какие ещё паттерны есть? Порождающие: • Фабричный метод • Абстрактная фабрика • Строитель • Прототип Структурные: • Адаптер • Компоновщик • Декоратор • Фасад • Легковес • Заместитель Поведенческие: • Цепочка обязанностей • Команда • Итератор • Состояние

Slide 17

Slide 17 text

17 мая 2022 [email protected] Олисеенко Валерий Дмитриевич Ассистент кафедры информатики Паттерны проектирования