Last active
August 27, 2024 11:25
-
-
Save VladislavSoren/b955e167237b75a3e913fa3d4d84356c to your computer and use it in GitHub Desktop.
design_pattern_flyweight_example
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| import json | |
| from typing import Dict | |
| class Flyweight: | |
| """ | |
| Легковес хранит общую часть состояния (также называемую внутренним | |
| состоянием), которая принадлежит нескольким реальным бизнес-объектам. | |
| Легковес принимает оставшуюся часть состояния (внешнее состояние, уникальное | |
| для каждого объекта) через его параметры метода. | |
| """ | |
| def __init__(self, shared_state: list) -> None: | |
| self._shared_state = shared_state | |
| def operation(self, unique_state: list) -> 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: list) -> None: | |
| for state in initial_flyweights: | |
| self._flyweights[self.get_key(state)] = Flyweight(state) | |
| def get_key(self, state: list) -> str: | |
| """ | |
| Возвращает хеш строки Легковеса для данного состояния. | |
| """ | |
| return "_".join(sorted(state)) | |
| def get_flyweight(self, shared_state: list) -> 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() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment