Паттерн: Легковес (Flyweight)
1️⃣ Как кратко ответить
Паттерн "Легковес" (Flyweight) используется для оптимизации использования памяти в приложениях, где создается множество объектов. Он позволяет разделять общие состояния объектов, сохраняя уникальные состояния отдельно. Это снижает затраты на хранение и управление объектами, особенно когда их количество велико.
2️⃣ Подробное объяснение темы
Паттерн проектирования "Легковес" (Flyweight) — это структурный паттерн, который помогает минимизировать использование памяти при работе с большим количеством объектов. Он делает это за счет разделения состояния объектов на внутреннее и внешнее. Внутреннее состояние является общим и неизменным, а внешнее — уникальным для каждого объекта.
Зачем это нужно?
Представьте, что вы разрабатываете текстовый редактор, который должен отображать миллионы символов. Каждый символ может иметь свои уникальные атрибуты, такие как шрифт, размер и цвет. Если создавать отдельный объект для каждого символа, это может привести к значительным затратам памяти. Паттерн "Легковес" позволяет оптимизировать использование памяти, разделяя общие атрибуты (например, шрифт) и уникальные (например, позиция символа).
Где применяется?
- Графические редакторы: для оптимизации хранения и отображения графических примитивов.
- Текстовые редакторы: для управления символами и их атрибутами.
- Игры: для управления множеством объектов, таких как частицы или враги, с общими характеристиками.
Как работает?
-
Разделение состояния: Определите, какие части состояния объектов являются общими (внутреннее состояние) и какие — уникальными (внешнее состояние).
-
Создание легковесов: Создайте объекты, которые содержат только внутреннее состояние. Эти объекты называются легковесами.
-
Управление внешним состоянием: Внешнее состояние передается легковесу при его использовании, что позволяет одному легковесу обслуживать множество объектов.
Пример
Рассмотрим пример с текстовым редактором:
class CharacterFlyweight:
def __init__(self, font, size, color):
self.font = font
self.size = size
self.color = color
def display(self, position):
print(f"Character at {position} with font={self.font}, size={self.size}, color={self.color}")
class CharacterFactory:
_flyweights = {}
@staticmethod
def get_flyweight(font, size, color):
key = (font, size, color)
if key not in CharacterFactory._flyweights:
CharacterFactory._flyweights[key] = CharacterFlyweight(font, size, color)
return CharacterFactory._flyweights[key]
# Использование
factory = CharacterFactory()
# Создаем легковесы для символов
char_a = factory.get_flyweight("Arial", 12, "black")
char_b = factory.get_flyweight("Arial", 12, "black")
# Используем легковесы с разными внешними состояниями
char_a.display((10, 20))
char_b.display((30, 40))
В этом примере CharacterFlyweight хранит общие атрибуты символов, такие как шрифт, размер и цвет. CharacterFactory управляет созданием и кэшированием легковесов. Каждый символ на экране может использовать один и тот же легковес, но с разными позициями, что позволяет экономить память.
🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!
Подписаться