Позволяет вместить большее количество объектов в отведённую оперативной память за счёт экономного разделения общего состояния объектов между собой, вместо хранения одинаковых данных в каждом объекте.
Неизменяемые данные объекта принято называть «внутренним состоянием». Все остальные данные - это «внешнее состояние».
Так как объекты легковесов будут использованы в разных контекстах, вы должны быть уверены в том, что их состояние невозможно изменять после создания (final). Всё внутреннее состояние легковес должен получать через параметры конструктора. Он не должен иметь сеттеров и публичных полей.
Flyweight дополняет шаблон Factory Method таким образом, что при обращении клиента Factory Method для создания нового объекта ищет уже созданный объект с такими же параметрами, что и у требуемого, и возвращает его клиенту. Если такого объекта нет, то фабрика создаст новый.
Обычно этот метод добавляют в контейнер легковесов либо создают отдельный класс-фабрику. Его даже можно сделать статическим и поместить в класс легковесов.
-
Когда не хватает оперативной памяти для поддержки всех нужных объектов.
-
Эффективность паттерна Легковес во многом зависит от того, как и где он используется. Применяйте этот паттерн, когда выполнены все перечисленные условия:
-
в приложении используется большое число объектов;
-
(из-за этого) высоки расходы оперативной памяти;
-
большую часть состояния объектов можно вынести за пределы их классов;
-
многие группы объектов можно заменить относительно небольшим количеством разделяемых объектов, поскольку внешнее состояние вынесено.
-
-
-
Разделите поля класса, который станет легковесом, на две части:
-
внутреннее состояние: значения этих полей одинаковы для большого числа объектов.
-
внешнее состояние (контекст): значения полей уникальны для каждого объекта.
-
-
Оставьте поля внутреннего состояние в классе, но убедитесь, что их значения неизменяемы. Эти поля должны инициализироваться только через конструктор (final).
-
Превратите поля внешнего состояния в аргументы методов, где эти поля использовались. Затем, удалите поля из класса.
-
Создайте фабрику, которая будет кешировать и повторно отдавать уже созданные объекты. Клиент должен запрашивать легковеса с определённым внутренним состоянием из этой фабрики, а не создавать его напрямую.
-
Клиент должен хранить или вычислять значения внешнего состояния (контекст) и передавать его в методы объекта легковеса.
| + | - |
|---|---|
| Экономит оперативную память. | Расходует процессорное время на поиск/вычисление контекста. |
| Усложняет код программы за счёт множества дополнительных классов. |
-
Компоновщик часто совмещают с Легковесом, чтобы реализовать общие ветки дерева и сэкономить при этом память.
-
Легковес показывает, как создавать много мелких объектов, а Фасад показывает, как создать один объект, который отображает целую подсистему.
-
Паттерн Легковес может напоминать Одиночку, если для конкретной задачи у вас получилось уменьшить количество объектов к одному. Но помните, что между паттернами есть два кардинальных отличия:
-
В отличие от Одиночки, вы можете иметь множество объектов-легковесов.
-
Объекты-легковесов должны быть неизменяемыми, тогда как объект-одиночки допускает изменение своего состояния.
-
