Назначение: использует разделение для эффективной поддержки множества мелких объектов.

Общая структура решения.

 

 

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

ConcreteFlyweight – конкретный приспособленец: реализует интерфейс класса Flyweight и добавляет при необходимости внутреннее состояние. Объект класса ConcreteFlyweight должен быть разделяемым. Любое сохраняемое им состояние должно быть внутренним, то есть не зависящим от контекста.

UnsharedConcreteFlyweight – неразделяемый конкретный приспособленец: не все подклассы Flyweight обязательно должны быть разделяемыми – интерфейс Flyweight допускает разделение, но не навязывает его. Обычно у объектов UnsharedConcreteFlyweight на некотором уровне структуры есть вложенные объекты в виде объектов класса ConcreteFlyweight.

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

Client – клиент: хранит ссылки на одного или нескольких приспособленцев; вычисляет или хранит внешнее состояние приспособленцев.

Состояние, необходимое приспособленцу для нормальной работы, можно охарактеризовать как внутреннее или внешнее. Первое хранится в самом объекте ConcreteFlyweight. Внешнее состояние хранится или вычисляется клиентами. Клиент передает его приспособленцу при вызове операций. Клиенты не должны создавать экземпляры класса ConcreteFlyweight напрямую, а могут получать их только от объекта FlyweightFactory. Это позволит гарантировать корректное разделение.