Обзор темы [Шаблоны проектирования]

Затем: МотивацияНазначение

Использует совмещение, чтобы эффективно поддерживать большие количества мелких объектов.

Затем: СтруктураМотивация

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

Недостаток такого проекта - его стоимость. Даже документы небольшого размера могут требовать сотен тысяч символьных объектов, которые съедят большое количество памяти и могут подвергаться недопустимыми затратами во время выполнения. Шаблон Flyweight описывает, как совместно использовать объекты, чтобы позволить их использование при прекрасных степенях детализации без препятствующей стоимости.

Flyweight - общедоступнный объект, который может использоваться во множественных контекстах одновременно. Flyweight действует как независимый объект в каждом контексте. Flyweight-ы не делают никаких предположений относительно того контекста, в котором они функционируют. Ключевой принцип здесь - различие между внутренним и внешним состояниями. Внутреннее состояние сохранено в flyweight; оно состоит из информации, независящей от контекста flyweight, таким образом, делая его разделяемым. Внешнее состояние зависит и изменяется с контекстом flyweight, а следовательно не может быть разделено. Клиентские объекты ответственны за прохождение внешнего состояния к flyweight, когда это требуется.

Flyweights моделирует элементы, которые появляются слишком часто, чтобы представляться объектами. Например, редактор документа может создавать flyweight для каждого символа алфавита. Каждый flyweight сохраняет символьный код, но его координатная позиция в документе и информация о его типографском стиле может быть определена из текстовых алгоритмов размещения и команд форматирования в действительности везде, где символ появляется. Символьный код - встроенное состояние, в то время как другая информация внешняя.

Логически имеется объект для каждого местонахождения данного символа в документе:

Физически, однако, существует один flyweight объект на символ, и он появляется в различных контекстах в структуре документа. Каждое местонахождение специфического символьного объекта обращается к тому же самому объекту в общедоступном объединении flyweight объектов:

Структура класса для этих объектов показана ниже. Glyph - абстрактный класс для графических объектов, некоторые из которых могут быть flyweights. Операции, которые могут зависеть от внешнего состояния, передают его как параметр. Например, Draw и Intersects, должны узнать, какому контексту glyph принадлежит прежде, чем они смогут делать свою работу.

Flyweight представление символа "a" только сохраняет соответствующий код символа; не требоваться сохранить его расположение или шрифт. Клиент обеспечивает ассоциативную информацию, которую flyweight должен рисовать самостоятельно.

Поскольку число различных символьных объектов гораздо меньше чем число символов в документе, общее число объектов в основном меньше чем то, которое использовала бы наивная реализация. Документ, в котором все символы появляются в том же самом шрифте и цвете, распределит на порядке 100 символьных объектов (грубо размер набора символов ASCII) независимо от длины документа. И начиная с большинства использования документов не больше, чем 10 различных комбинаций цветов шрифта, этот номер не будет расти заметно. Объектная абстракция, таким образом, становится практической для индивидуальных символов.

Затем: Составные частиСтруктура

Следующая объектная диаграмма показывает, как flyweight-ы разделены:

Составные части