Что такое шаблон проектирования легковеса?
Приспособленец — это общий объект, который можно использовать одновременно в нескольких контекстах.
Шаблон проектирования Flyweight используется, когда необходимо создать большое количество объектов практически одинакового характера. Большое количество объектов потребляет большой объем памяти, и шаблон проектирования Легковес предоставляет решение для снижения нагрузки на память за счет совместного использования объектов.
Диаграмма классов шаблона проектирования легковеса:
Как показано на предыдущей диаграмме, шаблон проектирования легковеса состоит из трех компонентов:
1-Наилегчайший вес:
Это интерфейс, который определяет элементы объектов-легковесов. Этот интерфейс позволяет совместно использовать, но не обеспечивает его соблюдение.
2-ConcreteFlyweight (общий или неразделенный):
a-SharedConcreteFlyweight:
класс, который реализует интерфейс Flyweight и добавляет хранилище для внутреннего состояния, если таковое имеется, и должно быть доступным для совместного использования.
b-UnsharedConcreteFlyweight:
класс также реализует интерфейс Flyweight и добавляет хранилище для конкретного экземпляра, и оно не является общим.
3-Фабрика наилегчайшего веса:
имеет метод GetFlyweight. этот метод проверит, есть ли объект-легковес в кеше или нет. Если он есть, он вернет этот существующий объект-легковес. А если его там нет, то он создаст новый объект-легковес, добавит этот объект в кеш и вернет этот объект-легковес.
Различные состояния в шаблоне проектирования Flyweight:
Внутренние состояния:
вещи, которые являются константами и хранятся в памяти.
Внешние состояния:
это вещи, которые не являются константами и должны быть рассчитаны на Fly
и поэтому не сохраняются в памяти.
Клиентские объекты отвечают за передачу внешнего состояния легковесу, когда он в этом нуждается.
Понимание шаблона проектирования легковеса на примере:
Предположим, нам нужно создать 30000круглых объектов красного цвета, 30000 круговых объектов серого цвета и >50000 Треугольные объекты желтого цвета.
Без использования наилегчайшего веса
мы будем создавать новый объект круга или треугольника каждый раз, когда нам понадобится один из них, и заливать его нужным цветом, что означает 30000 объектов круга красного цвета и 30000 объектов круга серого цветаcolor и 50000 треугольных объектов желтого цвета, и это определенно потребует большого объема памяти.
Использование наилегчайшего веса
мы создадим и сохраним в кэше один объект круга и один объект треугольника без цвета. и когда нам нужно создать круг или треугольник, мы можем получить объект из кеша, затем, используя этот объект, мы передадим нужный цвет, что означает, что нам просто нужен 1 объект круга для рисования (30000 объектов круга красного цвета и 30000 круглых объектов серого цвета ) и 1 треугольный объект для рисования 50000 треугольных объектов желтого цвета.
В нашем примере круг и треугольник будут представлять SharedConcreteFlyweight, а прямоугольник будет представлять UnsharedConcreteFlyweight.
Следующая диаграмма иллюстрирует решение с помощью Flyweight:
Диаграмма классов для нашего примера:
Внутренние состояния и внешние состояния в нашем примере:
В нашем примере формы круга и треугольника являются постоянными (они не изменяются). Это означает, что при изменении цвета форма круга или треугольника останется прежней. Итак, он хранится в памяти (кеше). А поскольку он хранится в памяти и является постоянным, он принадлежит внутреннему состоянию.
но цвет не постоянный и вычисляется на лету. поэтому он не хранится в памяти (кеше). В результате цвет принадлежит внешнему состоянию.
Выполнение:
Когда использовать шаблон проектирования Flyweight?
Нам нужно использовать шаблон проектирования Flyweight, когда
1 — используется много похожих объектов, а стоимость хранения высока.
2 – большинство данных о состоянии каждого объекта можно сделать внешними.
3 -Несколько общих объектов легко заменят множество неразделенных объектов.
Ссылка на полный код на Github:
Структурные модели дизайна/7-FlyweightDP
Полный репозиторий шаблонов проектирования на Github
В этом репозитории вы найдете все сводки шаблонов проектирования, которые я сделал, а также ссылки, от которых я завишу.