Middle+
41
questionbank

Что такое паттерн проектирования 'Приспособленец' (Flyweight)?

Получайте ответы на вопросы в реальном времени с Sobes Copilot
Ответ от нейросети sobes.tech

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

Паттерн разделяет состояние объекта на две части:

  1. Внутреннее состояние (Intrinsic State): Состояние, общее для всех объектов и не зависящее от их контекста. Оно хранится внутри Приспособленца и разделяется между многими клиентами.
  2. Внешнее состояние (Extrinsic State): Состояние, зависящее от контекста использования объекта. Оно передаётся клиентом в методы Приспособленца по мере необходимости.

Основные компоненты паттерна:

  • Flyweight (Приспособленец): Интерфейс или абстрактный класс, объявляющий методы, которые принимают внешнее состояние в качестве параметра.
  • ConcreteFlyweight (Конкретный Приспособленец): Класс, реализующий интерфейс Flyweight и хранящий внутреннее состояние.
  • FlyweightFactory (Фабрика Приспособленцев): Класс, управляющий созданием и кешированием объектов ConcreteFlyweight. Он проверяет, существует ли уже Приспособленец с заданным внутренним состоянием, и возвращает его, либо создает новый.
  • Client (Клиент): Объект, использующий Приспособленцев, который хранит внешнее состояние и вызывает методы Приспособленцев, передавая это состояние.

Пример использования: текстовый редактор. Символы (буквы, цифры) могут быть Приспособленцами. Внутреннее состояние символа - это сам символ (например, 'A'). Внешнее состояние - это его позиция, цвет, размер шрифта. Вместо создания нового объекта для каждого символа в документе, создается только один объект для каждого уникального символа, и его характеристики форматирования применяются "извне".

python

Преимущества:

  • Сокращение потребления памяти благодаря разделению общего состояния.
  • Уменьшение количества создаваемых объектов.

Недостатки:

  • Усложнение кода из-за разделения состояния.
  • Необходимость передачи внешнего состояния в каждый вызов метода.
  • Может быть избыточным, если количество объектов невелико или их состояние сильно различается.