М. Язык шаблонов: города, здания, строительство. – Москва: Изд-во Студии Артемия Лебедева, 2014. – 1093 с. • Гамма Э., Хелм Р., Джонсон Р., Влиссидес Д. Приемы объектно-ориентированного проектирования. Паттерны проектирования.– 2007. [23 паттерна, GoF book]
решения • Создание понятной архитектуры Критика: • Костыли для слабого языка • Неэффективные решения («как в книжке») • Неправильное применение (Золотой молоток)
• Структурные паттерны (способы связи между объектами) • Поведенческие паттерны (коммуникация между объектами) Основная цель изучения паттернов — понять зачем и как применять
класса есть только один экземпляр и глобальная точка доступа Проблема: - Нужен постоянный объект при обращении к классу - Нужна глобальная «защищенная» (от перезаписи) точка доступа Решение: скрыть конструктор класса и реализовать static-метод для управления классом
класса • Когда нужен контроль над глобальными переменными Плюсы и минусы: + Гарантирует наличие одного экземпляра класса + Даёт глобальную точку доступа + Отложенная инициализация – Нарушение принципов ООП – Может маскировать плохой дизайн программы – Проблемы с многопоточностью https://bool.dev/blog/detail/pattern-singleton
поле, которое будет содержать одиночный объект 2) Объявить статический метод для создания одиночки (getInstance()) 3) Добавить в статический метод (getInstance()) создание объекта при первом вызове метода 4) Создать приватный конструктор 5) Заменить вызовы конструктора одиночка вызовами его создающего метода
реализаций одной функциональности • Когда класс нужно расширять в двух независимых плоскостях • Когда необходимо изменять во время выполнения программы Плюсы и минусы: + Возможность построения кросс-платформенные программы + Возможность скрыть детали клиентского кода – Сильно усложняет код программы
разделить класс 2) Выделить и описать абстракцию (базовый класс, «фигура») 3) Выделить часть, необходимую абстракции — реализация (общий интерфейс, «цвет фигуры») 4) Под каждую задачу опишите конкретную реализацию (красный цвет, черный цвет и т.д.) 5) Добавьте в класс абстракции ссылку на объект реализации 6) Если у вас есть несколько вариаций абстракции, создайте для каждой из них свой подкласс 7) Подать объект реализации в конструктор абстракции, чтобы связать их воедино. Использовать объект абстракции
объектов Проблема: • создание и откат истории файла • приватность • изменение кода классов копирования Решение: поручить создание копии состояния объекта самому объекту, который этим состоянием владеет
• Когда прямое получение состояния объекта раскрывает приватные детали его реализации, нарушая инкапсуляцию Плюсы и минусы: + Не нарушает инкапсуляции исходного объекта + Исходному объекту не надо хранить свою историю – Требует много памяти – Сложно гарантировать приватность (Python, JS, PHP и др.)
класс снимка и опишите поля как у создателя 3) Защитите объект снимка от изменений 4) Сделайте класс снимка вложенным в класс создателя (или создайте интерфейс) 5) Добавьте в класс создателя метод получения снимков 6) Добавьте в класс создателя метод восстановления из снимка