Цель использования шаблона flyweight - избежать ненужной инициализации объекта и, таким образом, сэкономить место. Как определено GOF , объект может иметь два состояния, внутреннее и внешнее:
- Внутреннее состояние: хранится в навесном весе; он состоит из информации, которая не зависит от контекста flyweights, что делает ее доступной для совместного использования.
- Внешнее состояние: зависит от контекста мухи и зависит от него и поэтому не может быть общим. Клиентские объекты несут ответственность за передачу внешнего состояния к весу, когда это необходимо.
Предполагая, что мы хотим разработать простое приложение для текстового редактора, в котором каждый столбец содержит все строки текста, а строка может содержать символы.
Дилемма здесь заключается в том, как создать класс Character. char cВнутри класса символов должно быть основным (внутреннее состояние) объекта. Тем не менее, символ может иметь шрифт и размер (внешнее состояние); таким образом, нам нужно сохранить его внешнее состояние в строке (клиенте) и обращаться к нему при необходимости. Для этого создаются два списка, в которых хранятся шрифты и размеры.
Следуя шаблону Flyweight, персонаж теперь можно использовать повторно, и на объекты ссылаются из определенного списка объектов (пула flyweight), который содержит все символы ASCII ( Characterобъекты).
Вот что я описал визуально:

Для печати «привет» Characterнужно только 4 объекта вместо 5. После изменения шрифта новые объекты не требуются; обратите внимание, что это было бы невозможно, если бы мы сохранили внешнее состояние в классе Character, например,
class Character
{
char c;
int Size;
Font font;
....
}
Применение этого шаблона для больших наборов данных приведет к значительной оптимизации сложности памяти приложения и возможности повторного использования объектов.