Легковес – это структурный паттерн проектирования, который позволяет вместить бóльшее количество объектов в отведённую оперативную память. Легковес экономит память, разделяя общее состояние объектов между собой, вместо хранения одинаковых данных в каждом объекте.
Паттерн "Легковес" (Flyweight) предназначен для оптимизации использования памяти при работе с большим количеством мелких объектов, которые могут быть сгруппированы по определенным характеристикам. Это достигается за счет разделения внутреннего и внешнего состояния объектов. Внутреннее состояние (общее для группы объектов) хранится в легковесных объектах, а внешнее (уникальное для каждого объекта) - в клиентском коде. Это позволяет существенно сократить количество объектов, необходимых для работы, и снизить потребление памяти.
Схожие шаблоны и их отличия
- Декоратор (Decorator): Оба паттерна используют композицию для расширения функциональности объектов, но в то время как Декоратор добавляет или изменяет поведение объектов динамически, Легковес фокусируется на оптимизации использования памяти за счет разделения состояния объектов.
- Одиночка (Singleton): Оба паттерна контролируют создание объектов, но Легковес позволяет создавать множество легковесных объектов, которые разделяют общую часть состояния, в то время как Одиночка гарантирует, что существует только один экземпляр класса.
Реализация шаблона в общем виде
- Интерфейс Flyweight определяет методы для доступа к внутреннему и внешнему состоянию объекта.
- Конкретный Flyweight реализует интерфейс Flyweight, храня в себе часть внутреннего состояния и делегируя доступ к внешнему состоянию клиенту.
- Фабрика Flyweight (Flyweight Factory) управляет созданием и повторным использованием объектов Flyweight. Она определяет, какие объекты Flyweight уже существуют, и возвращает существующий объект, если он соответствует запросу, или создает новый объект в противном случае.
- Клиент (Client) использует объекты Flyweight, не зная о их внутренней реализации, и хранит внешнее состояние, передавая его в объекты Flyweight при необходимости.
Пример
Рассмотрим применение паттерна на примере учета представителей разных компаний, которые приехали на конференцию по IT.
Выделим в структуру Shared общие свойства представителей.
По аналогии создадим структуру Unique, содержащюю уникальные свойства, которые нет необходимости сохранять в области памяти с повторяющимися значениями.
Создадим класс легковес.
Создадим фабрику легковесов в которой будут храниться и накапливаться общие данные на представителей компании.
Посмотрим применение.
Результат.