This is a mirror of official site: http://jasper-net.blogspot.com/

Структурные шаблоны: Приспособленец (Flyweight)

| Tuesday, December 21, 2010
Название шаблона
Приспособленец (Flyweight).

Тип
Структурный шаблон проектирования (Structural).

Описание
Приспособленец это экземпляр объекта, который выдается себя за группу самостоятельных экземпляров.

Шаблон применяется если:

  • в приложении используется большое число очень схожих экземпляров заданного класса;
  • (и) часть состояния объекта является контекстной и может быть легко вынесена во внешние структуры;
  • (и) после вынесения части состояния, все экземпляры становятся одинаковыми и это дает возможность заменить их одним;
  • (и) приложение не проверяет идентичность объектов, т.к. в этом случае все якобы самостоятельные экземпляры являются одним объектом.
Результатом использования шаблона Приспособленец является уменьшение количества экземпляров и, как следствие, экономия ресурсов. Кроме того, если процедура порождения объекта достаточно затратная, то возможна оптимизация этого процесса. Ценой за это будет вынесение части состояния (данных) объекта за его пределы.

Рассмотрим, уже упоминавшийся в описании шаблона Компоновщик, пример с выводом карты. Обратим внимание на такие объекты как "элемент дороги" и "дерево". Они могут иметь несколько вариантов (например лиственное, хвойное дерево, куст и т.д.). Но при этом все экземпляры конкретного варианта отличаются только координатами положения на карте. Вынеся эти контекстные данные во вне, возможно заменить все экземпляры на один. При этом будет ощутимая экономия памяти, т.к. картинка с изображением дерева будет загружена только в одном экземпляре.

Наличие различных вариантов внутреннего состояния приводит к необходимости создания Пула приспособленцев. При запросе нового экземпляра от клиента, он ищет подходящий вариант среди ранее созданных. Если такого не находится, то порождается новый. Для примера выше, Пул приспособленцев создавал бы и содержал различные варианты объекта "дерево", различающиеся выводимой картинкой: хвойное, лиственное, куст и т.д. Аналогично для "элемента дороги": прямые участки разного направления, повороты, перекрестки и т.д.

Таким образом, можно отметить следующих участников шаблона:

Приспособленец (Flyweight) –  объект-приспособленец.
Пул или Фабрика приспособленцев (Flyweight Pool / Factory) – объект, создающий и управляющий экземплярами Приспособленцев.
Неразделяемый объект (Unshared Flyweight) – экземпляр, существующий вне рамок шаблона.
Особенности применения шаблона
Главным моментом при реализации шаблона является правильное разделение состояния объекта на внутреннее и внешнее. Именно возможность сделать это корректно и является главным фактором применимости шаблона. При этом очень важно, чтобы вынесенная информация вписывалась в абстракцию ее нового хранилища. Так, например, информация о координатах деревьев вполне соответствует абстракции, описываемой объектом "квартал города". А вот графическое изображение самого дерева уже является для него посторонним.

Некоторые объекты могут иметь очень большое число различных вариантов состояния. Тогда в результате применения шаблона общее число объектов не сильно уменьшится. В этом случае можно рассмотреть следующий вариант: вынесенное состояние не сохраняется в отдельной структуре, а рассчитывается непосредственно перед вызовом Приспособленца. Разумеется, такие вычисления не должны быть сложными и наносить урон производительности приложения.


Read more: Andrey on .NET

Posted via email from .NET Info

0 comments: