Nội dung
Flyweight là một mẫu thiết kế cấu trúc cho phép các chương trình hỗ trợ số lượng lớn các đối tượng bằng cách giữ mức tiêu thụ bộ nhớ của chúng ở mức thấp.
Mẫu đạt được điều đó bằng cách chia sẻ các phần trạng thái của đối tượng giữa nhiều đối tượng. Nói cách khác, Flyweight tiết kiệm RAM bằng cách lưu vào bộ nhớ đệm cùng một dữ liệu được sử dụng bởi các đối tượng khác nhau.
Cách sử dụng mẫu
Sử dụng: Mẫu Flyweight có một mục đích duy nhất: giảm thiểu lượng bộ nhớ. Nếu chương trình của bạn không gặp khó khăn với tình trạng thiếu RAM, thì bạn có thể bỏ qua mẫu này một thời gian.
Nhận dạng: Flyweight có thể được nhận dạng bằng một phương pháp tạo trả về các đối tượng được lưu trong bộ nhớ cache thay vì tạo mới.
Chương trình mẫu
main.py
import json
from typing import Dict
class Flyweight():
"""
Flyweight lưu trữ một phần trạng thái chung (còn gọi là trạng thái nội tại)
thuộc về nhiều thực thể thực. Flyweight chấp nhận phần trạng thái còn lại
(trạng thái ngoại vi, duy nhất cho mỗi thực thể) thông qua các tham số
phương thức của nó.
"""
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():
"""
Flyweight Factory tạo và quản lý các đối tượng Flyweight. Nó đảm bảo rằng
các flyweight được chia sẻ một cách chính xác. Khi client yêu cầu, factory
sẽ trả về một phiên bản hiện có hoặc tạo một phiên bản mới, nếu nó chưa
tồn tại.
"""
_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:
"""
Trả về chuỗi băm của Flyweight cho một trạng thái nhất định.
"""
return "_".join(sorted(state))
def get_flyweight(self, shared_state: Dict) -> Flyweight:
"""
Trả lại Flyweight hiện có với trạng thái nhất định hoặc tạo một cái mới.
"""
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])
# Client hoặc lưu trữ hoặc tính toán trạng thái ngoại vi và chuyển nó
# đến các phương thức của flyweight.
flyweight.operation([plates, owner])
if __name__ == "__main__":
"""
Client thường tạo trước một loạt các flyweight trong giai đoạn khởi
tạo ứng dụng.
"""
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()
Kết quả
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
Để lại một bình luận