-
Notifications
You must be signed in to change notification settings - Fork 198
/
Copy pathmain.py
139 lines (105 loc) · 5.42 KB
/
main.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
"""
EN: Flyweight Design Pattern
Intent: Lets you fit more objects into the available amount of RAM by sharing
common parts of state between multiple objects, instead of keeping all of the
data in each object.
RU: Паттерн Легковес
Назначение: Позволяет вместить бóльшее количество объектов в отведённую
оперативную память. Легковес экономит память, разделяя общее состояние объектов
между собой, вместо хранения одинаковых данных в каждом объекте.
"""
import json
from typing import Dict, List
class Flyweight:
"""
EN: The Flyweight stores a common portion of the state (also called
intrinsic state) that belongs to multiple real business entities. The
Flyweight accepts the rest of the state (extrinsic state, unique for each
entity) via its method parameters.
RU: Легковес хранит общую часть состояния (также называемую внутренним
состоянием), которая принадлежит нескольким реальным бизнес-объектам.
Легковес принимает оставшуюся часть состояния (внешнее состояние, уникальное
для каждого объекта) через его параметры метода.
"""
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:
"""
EN: The Flyweight Factory creates and manages the Flyweight objects. It
ensures that flyweights are shared correctly. When the client requests a
flyweight, the factory either returns an existing instance or creates a new
one, if it doesn't exist yet.
RU: Фабрика Легковесов создает объекты-Легковесы и управляет ими. Она
обеспечивает правильное разделение легковесов. Когда клиент запрашивает
легковес, фабрика либо возвращает существующий экземпляр, либо создает
новый, если он ещё не существует.
"""
_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:
"""
EN: Returns a Flyweight's string hash for a given state.
RU: Возвращает хеш строки Легковеса для данного состояния.
"""
return "_".join(sorted(state))
def get_flyweight(self, shared_state: List) -> Flyweight:
"""
EN: Returns an existing Flyweight with a given state or creates a new
one.
RU: Возвращает существующий Легковес с заданным состоянием или создает
новый.
"""
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])
# EN: The client code either stores or calculates extrinsic state and passes
# it to the flyweight's methods.
#
# RU: Клиентский код либо сохраняет, либо вычисляет внешнее состояние и
# передает его методам легковеса.
flyweight.operation([plates, owner])
if __name__ == "__main__":
"""
EN: The client code usually creates a bunch of pre-populated flyweights in
the initialization stage of the application.
RU: Клиентский код обычно создает кучу предварительно заполненных легковесов
на этапе инициализации приложения.
"""
car_factory = FlyweightFactory(
[
["Chevrolet", "Camaro2018", "pink"],
["Mercedes Benz", "C300", "black"],
["Mercedes Benz", "C500", "red"],
["BMW", "M5", "red"],
["BMW", "X6", "white"],
]
)
car_factory.list_flyweights()
add_car_to_police_database(car_factory, "CL234IR", "James Doe", "BMW", "M5", "red")
add_car_to_police_database(car_factory, "CL234IR", "James Doe", "BMW", "X1", "red")
print("\n")
car_factory.list_flyweights()