Что такое шаблон проектирования легковеса?

Приспособленец — это общий объект, который можно использовать одновременно в нескольких контекстах.

Шаблон проектирования 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

В этом репозитории вы найдете все сводки шаблонов проектирования, которые я сделал, а также ссылки, от которых я завишу.

https://github.com/MohamedHashish42/Design_Patterns