Приспособленец (Flyweight)

Метафора

 

Представьте, что нам требуется поставить пьесу. Однако по сценарию в этой пьесе задействованы несколько десятков людей, которые по своей сути выполняют одинаковые действия, например, участвуют в массовках различных сцен в разные промежутки времени, но между ними всё же есть какие-то различия (например, костюмы). Нам бы стоило огромных денег нанимать для каждой роли отдельного актера, поэтому мы используем паттерн «приспособленец». Мы создадим все нужные нам костюмы, но для каждой массовки будем переодевать небольшую группу актеров в требуемые для этой сцены костюмы. В результате мы имеем возможность ценой малых ресурсов создавать видимость управления большим количеством казалось бы разных объектов.

 

Назначение

 

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

Используется, когда:

  • В приложении используется большое число очень похожих друг на друга экземпляров заданного класса;
  • Часть состояния объекта является контекстной и может быть легко вынесена во внешние структуры;
  • После вынесения части состояния все объекты становятся одинаковыми и это даёт возможность заменить их одним;

В результате использования шаблона создаётся гораздо меньше экземпляров, что влечёт за собой экономию ресурсов.

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

Приспособленцы моделируют сущности предметной области, число которых слишком велико для представления их реальными объектами.

Недостаток:

  • При большом объеме разделяемых приспособленцев, увеличивается время на его поиск в пуле (FlyweightFactory).

 

Диаграмма

 

Приспособленец

Приспособленец

Существуют два типа приспособленцев:

  • UnsharedConcreteFlyweight — объект, который не управляется через фабрику приспособленцев, а создаётся клиентом напрямую;
  • ConcreteFlyweight — объект, доступ к которому клиент получает через фабрику приспособленцев FlyweightFactory по некоторому ID ключу.

 

Пример

 

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

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