← Назад ко всем вопросам

Паттерн: Легковес (Flyweight)

1️⃣ Как кратко ответить

Паттерн "Легковес" (Flyweight) используется для оптимизации использования памяти в приложениях, где создается множество объектов. Он позволяет разделять общие состояния объектов, сохраняя уникальные состояния отдельно. Это снижает затраты на хранение и управление объектами, особенно когда их количество велико.

2️⃣ Подробное объяснение темы

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

Зачем это нужно?

Представьте, что вы разрабатываете текстовый редактор, который должен отображать миллионы символов. Каждый символ может иметь свои уникальные атрибуты, такие как шрифт, размер и цвет. Если создавать отдельный объект для каждого символа, это может привести к значительным затратам памяти. Паттерн "Легковес" позволяет оптимизировать использование памяти, разделяя общие атрибуты (например, шрифт) и уникальные (например, позиция символа).

Где применяется?

  • Графические редакторы: для оптимизации хранения и отображения графических примитивов.
  • Текстовые редакторы: для управления символами и их атрибутами.
  • Игры: для управления множеством объектов, таких как частицы или враги, с общими характеристиками.

Как работает?

  1. Разделение состояния: Определите, какие части состояния объектов являются общими (внутреннее состояние) и какие — уникальными (внешнее состояние).

  2. Создание легковесов: Создайте объекты, которые содержат только внутреннее состояние. Эти объекты называются легковесами.

  3. Управление внешним состоянием: Внешнее состояние передается легковесу при его использовании, что позволяет одному легковесу обслуживать множество объектов.

Пример

Рассмотрим пример с текстовым редактором:

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 управляет созданием и кэшированием легковесов. Каждый символ на экране может использовать один и тот же легковес, но с разными позициями, что позволяет экономить память.

Тема: ООП
Стадия: Tech

🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!

Твои заметки