НОВОГОДНЯЯ РАСПРОДАЖА!
Легковес

Легковес на Python

Легковес — это структурный паттерн, который экономит память, благодаря разделению общего состояния, вынесенного в один объект, между множеством объектов.

Легковес позволяет экономить память, кешируя одинаковые данные, используемые в разных объектах.

Сложность:

Популярность:

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

Признаки применения паттерна: Легковес можно определить по создающим методам класса, которые возвращают закешированные объекты, вместо создания новых.

Концептуальный пример

Этот пример показывает структуру паттерна Легковес, а именно — из каких классов он состоит, какие роли эти классы выполняют и как они взаимодействуют друг с другом.

main.py: Пример структуры паттерна

import json from typing import Dict class Flyweight(): """ Легковес хранит общую часть состояния (также называемую внутренним состоянием), которая принадлежит нескольким реальным бизнес-объектам. Легковес принимает оставшуюся часть состояния (внешнее состояние, уникальное для каждого объекта) через его параметры метода. """ def __init__(self, shared_state: str) -> None: self._shared_state = shared_state def operation(self, unique_state: str) -> None: s = json.dumps(self._shared_state) u = json.dumps(unique_state) print(f"Flyweight: Displaying shared ({s}) and unique ({u}) state.", end="") class FlyweightFactory(): """ Фабрика Легковесов создает объекты-Легковесы и управляет ими. Она обеспечивает правильное разделение легковесов. Когда клиент запрашивает легковес, фабрика либо возвращает существующий экземпляр, либо создает новый, если он ещё не существует. """ _flyweights: Dict[str, Flyweight] = {} def __init__(self, initial_flyweights: Dict) -> None: for state in initial_flyweights: self._flyweights[self.get_key(state)] = Flyweight(state) def get_key(self, state: Dict) -> str: """ Возвращает хеш строки Легковеса для данного состояния. """ return "_".join(sorted(state)) def get_flyweight(self, shared_state: Dict) -> Flyweight: """ Возвращает существующий Легковес с заданным состоянием или создает новый. """ key = self.get_key(shared_state) if not self._flyweights.get(key): print("FlyweightFactory: Can't find a flyweight, creating new one.") self._flyweights[key] = Flyweight(shared_state) else: print("FlyweightFactory: Reusing existing flyweight.") return self._flyweights[key] def list_flyweights(self) -> None: count = len(self._flyweights) print(f"FlyweightFactory: I have {count} flyweights:") print("\n".join(map(str, self._flyweights.keys())), end="") def add_car_to_police_database( factory: FlyweightFactory, plates: str, owner: str, brand: str, model: str, color: str ) -> None: print("\n\nClient: Adding a car to database.") flyweight = factory.get_flyweight([brand, model, color]) # Клиентский код либо сохраняет, либо вычисляет внешнее состояние и передает # его методам легковеса. flyweight.operation([plates, owner]) if __name__ == "__main__": """ Клиентский код обычно создает кучу предварительно заполненных легковесов на этапе инициализации приложения. """ factory = FlyweightFactory([ ["Chevrolet", "Camaro2018", "pink"], ["Mercedes Benz", "C300", "black"], ["Mercedes Benz", "C500", "red"], ["BMW", "M5", "red"], ["BMW", "X6", "white"], ]) factory.list_flyweights() add_car_to_police_database( factory, "CL234IR", "James Doe", "BMW", "M5", "red") add_car_to_police_database( factory, "CL234IR", "James Doe", "BMW", "X1", "red") print("\n") factory.list_flyweights() 

Output.txt: Результат выполнения

FlyweightFactory: I have 5 flyweights: Camaro2018_Chevrolet_pink C300_Mercedes Benz_black C500_Mercedes Benz_red BMW_M5_red BMW_X6_white Client: Adding a car to database. FlyweightFactory: Reusing existing flyweight. Flyweight: Displaying shared (["BMW", "M5", "red"]) and unique (["CL234IR", "James Doe"]) state. Client: Adding a car to database. FlyweightFactory: Can't find a flyweight, creating new one. Flyweight: Displaying shared (["BMW", "X1", "red"]) and unique (["CL234IR", "James Doe"]) state. FlyweightFactory: I have 6 flyweights: Camaro2018_Chevrolet_pink C300_Mercedes Benz_black C500_Mercedes Benz_red BMW_M5_red BMW_X6_white BMW_X1_red 

Легковес на других языках программирования

Легковес на C# Легковес на C++ Легковес на Go Легковес на Java Легковес на PHP Легковес на Ruby Легковес на Rust Легковес на Swift Легковес на TypeScript