Паттерны Flashcards
Что такое шаблон проектирования?
Шаблон проектирования - это часто встречающееся решение определенной проблемы при проектировании архитектуры программ.
Полюсы:
*Не надо изобретать велосипед
*Стандартизация кода
Приведите примеры основных шаблонов проектирования
**Делегирование ** - Сущность внешне выражает некоторое поведение, но в реальности передаёт ответственность за выполнение этого поведения связанному объекту
Функциональный дизайн - Гарантирует, что каждая сущность имеет только одну обязанность
Интерфейс - Общий метод структурирования сущностей, облегчающий их понимание.
Неизменяемый интерфейс - Создание неизменяемого объекта.
Интерфейс - маркер - это интерфейсы, которые не содержат методов. Когда класс наследуется от такого интерфейса, то говорят, что он им помечен.
Контейнер свойств - позволяет добавлять дополнительные свойства в контейнер внутрь себя вместо расширения новыми свойствами.
Канал событий - Создаёт централизованный канал для событий. Использует сущность-представитель для подписки и сущность-представитель для публикации события в канале. Представитель существует отдельно от реального издателя или подписчика. Подписчик может получать опубликованные события от более чем одной сущности, даже если он зарегистрирован только на одном канале.
Назовите основные характеристики шаблонов
Имя - все шаблоны имеют уникальное имя
Назначение данного шаблона
Задача которую шаблон позволяет решить
Способ решения предлагаемый в шаблоне для решения задачи в том конетксте где этот шаблон был найден
Участники - сущности, принмающие участие в этом шаблоне
Следствия от использования шаблона как результат применения шаблона
Реализация - возможный вариант реализации шаблона
Назовите основные три группы ШП
Порождающие(Singleton, Builder, Factory method, Abstract Factory, Prototype) - Эти паттерны отвечают за создание объектов
Структурные (Adapter, Decorator, Proxy) - Эти паттерны отвечают за построение гибких и расширяемых систем путем определения отношений между классами
Поведенческие(Iterator, Chain of responsibility, Template method) - Определяют способы эффективного взаимодействия между классами
Почему Singleton считается анти паттерном?
-Нельзя тестировать с помощью mock, но можно использовать powerMock.
-Нарушает принцип единой ответственности
-Нарушает Open/Close принцип, его нельзя расширить
Расскажите про паттерн Singleton
Гарантирует, что у класса есть только один экземпляр и представляет глобальную точку доступа к этому экземпляру
**Как реализовать? **
1) Добавить приватное статическое поле которое будет содержать объект
2) Объявить статический создающий метод, который будет использоваться для получения одиночки
3) Добавьте ленивую инициализацию
4) Конструктор приватный
Когда использовать?
Паттерн Singleton используется, когда в приложении требуется только один экземпляр определенного класса.
Например
- Управление настройками и конфигурациями: Если в приложении есть необходимость в одном месте хранить и использовать настройки, к которым должен иметь доступ любой компонент, Singleton может быть полезен.
- Работа с ресурсами: Когда нужно иметь только один экземпляр объекта, который обеспечивает доступ к ресурсам (например, базе данных, файлам, сетевому соединению и т. д.).
- Логирование: Инстанс класса логгирования может быть реализован как Singleton, чтобы иметь единое место записи логов из различных частей приложения.
** Минусы: **
Проблемы с тестированием
Расскажите про паттерн Builder
Разделяет процесс создания сложного объекта на отдельные шаги, позволяя создавать объект с различными конфигурациями.
Как реализовать
1) Создать общий интерфейс строителей с шагами создания объекта
2) Для каждого из представлений объекта написать реализацию строителя и реализуйте их методы
3) Метод для получения результата. У каждой реализации строителя свой, не указывается в интерфейсе.
4) Можно создать директор, который будет выполнять определенные шаги для каждого типа
5)
Плюс:
Паттерн проектирования Builder позволяет отделить построение сложного объекта от его представления.
Минусы
Избыточность: Для объектов с небольшим количеством параметров использование паттерна строитель может показаться избыточным и усложнить процесс создания объекта.
Когда использовать
Сложное создание объекта: Когда у вас есть объект с большим количеством параметров или параметры имеют сложные зависимости между собой, использование Builder может сделать процесс создания объекта более удобным и читаемым.
Расскажите про Factory method
Определяет интерфейс для создания объекта, но оставляет решение о его типе производным классам, обеспечивая гибкость создания объектов.
Одно из основных преимуществ фабричного метода заключается в том, что он позволяет создавать объекты, не привязываясь к конкретным классам, что делает код более гибким и расширяемым. При использовании этого паттерна создание объектов делегируется подклассам, позволяя им определять конкретные типы создаваемых объектов. Это позволяет легко добавлять новые типы объектов или изменять существующие без изменения основного кода, что улучшает поддерживаемость программы.
Когда использовать Когда нужно создавать объекты, но точный тип или конкретная реализация этого объекта неизвестны заранее или могут измениться в будущем.
Минусы
Усложнение отладки
Ненужная сложность для простых случаев: В случае создания простых объектов, где тип объекта известен заранее и не требует разнообразных вариаций, использование фабричного метода может быть излишним и усложнить код.
Расскажи про паттерн Абстрактная фабрика
Паттерн “Абстрактная фабрика” предоставляет интерфейс для создания семейств объектов без указания их конкретных классов.
Плюсы:
Отделение клиента от создания объектов: Позволяет клиентскому коду работать с абстрактными типами объектов, не завися от их конкретных классов.
Создание семейств объектов: Легко создавать семейства взаимосвязанных объектов, обеспечивая их совместимость.
Гибкость и масштабируемость: Позволяет добавлять новые виды объектов и их семейства без изменения существующего кода.
Минусы:
Усложнение структуры программы: Паттерн может привести к увеличению количества классов и интерфейсов, что усложнит программу и усложнит восприятие кода.
Увеличение сложности отладки: Связано с тем, что увеличивается количество классов и интерфейсов, что может сделать отладку более сложной и затратной по времени.
Возможность излишней абстракции: При неумелом использовании паттерна может возникнуть излишняя абстракция, усложняющая понимание системы.
Когда использовать:
Когда требуется создание семейств объектов: Если ваше приложение нуждается в создании не только отдельных объектов, но и семейств объектов, которые взаимосвязаны, паттерн “Абстрактная фабрика” может быть полезен.
Когда нужно обеспечить гибкость добавления новых объектов: Если система должна быть гибкой для добавления новых типов объектов или их семейств без изменения существующего кода.
Когда необходимо отделить создание объектов от их использования: Если требуется изолировать клиентский код от деталей создания объектов, позволяя ему работать с абстрактными типами.
Паттерн “Абстрактная фабрика” особенно полезен, когда вы строите систему, которая должна оставаться гибкой и легко расширяемой, при этом избегая прямых зависимостей между компонентами системы.
Расскажите про паттерн прототип(Prototype)
Позволяет создавать новые объекты на основе существующего
Плюсы:
Уменьшение нагрузки на систему: Клонирование объектов обычно более эффективно, чем создание новых объектов, особенно если создание объекта требует сложных операций и ресурсов.
Упрощение создания объектов: Позволяет создавать новые объекты, избегая сложностей написания кода для создания объекта с нуля.
Минусы:
Сложность клонирования сложных структур: Если объект имеет вложенные структуры или ссылки на другие объекты, клонирование может стать сложным и требовать дополнительных усилий.
Необходимость правильной реализации: Некорректная или неполная реализация паттерна Прототип может привести к проблемам с состоянием объектов или их поведением.
Когда использовать:
Когда требуется создание объектов с минимальными затратами: Если создание объектов является ресурсоемкой операцией, использование прототипа может быть более эффективным.
Когда нужно избежать длительной инициализации объектов: Если объекты имеют сложную инициализацию, клонирование может быть быстрым способом создания новых экземпляров.
В целом, паттерн Прототип полезен там, где создание объектов с нуля затратно, и когда требуется гибкость в создании и модификации объектов. Однако он может быть сложным в реализации для более сложных структур данных.
Расскажите про паттерн адаптер
Преобразует интерфейс в другой интерфейс, ожидаемый клиентом.
Плюс:
Улучшение повторного использования
Когда использовать:
Когда необходимо интегрировать существующий класс или компонент с новой системой, которая ожидает другой интерфейс.
Расскажите про паттерн Декоратор
Декоратор динамически наделяет объект новыми обязанностями.
Плюсы:
Гибкость и расширяемость: Декораторы позволяют добавлять новую функциональность объектам динамически, не изменяя их основной структуры. Это позволяет создавать множество комбинаций декораторов для получения нужного функционала.
Сохранение открытости кода: Паттерн декоратора позволяет добавлять новую функциональность, не нарушая принцип открытости/закрытости (Open/Closed Principle). Вы можете изменять функциональность объекта, не изменяя его класс.
Улучшение поддерживаемости кода: Поскольку каждый декоратор отвечает только за одну конкретную задачу, код становится более чистым и поддерживаемым. Можно легко добавлять или удалять функциональность, не затрагивая другие части системы.
Минусы:
Возможное усложнение структуры: При использовании множества декораторов или сложных комбинаций они могут усложнить структуру программы, что затруднит понимание кода для некоторых разработчиков.
Накладные расходы на производительность: Каждый декоратор добавляет свою логику к базовому объекту. Если имеется много вложенных декораторов или операции, требующие много ресурсов, это может негативно сказаться на производительности приложения.
Когда использовать:
Добавление функциональности без изменения основного класса: Когда требуется добавить или изменить функциональность объекта, не изменяя его основной структуры.
Постепенное добавление функциональности: Когда требуется динамически добавлять/удалять функциональность на этапе выполнения программы.
В целом, паттерн декоратора полезен там, где необходима гибкая и расширяемая функциональность без изменения исходного кода, но стоит учитывать потенциальные недостатки в виде усложнения структуры программы и дополнительных накладных расходов.
Расскажите про паттерн Заместитель (Proxy)
Предоставляет замену другому объекту для контроля доступа к нему или добавления дополнительной логики
Расскажите про шаблонный метод(Template method)
Определяет скелет алгоритма, но оставляет реализацию некоторых шагов на усмотрение подклассов.
Расскажите про паттерн Iterator
Предоставляет возможность последовательного доступа к элементам коллекции