Пример шаблона конструкции для навесного веса
Согласно шаблону "Банды четырех", структура шаблона проектирования Flyweight гласит, что как конкретный Flyweight (внутреннее состояние), так и Unshared Concrete Flyweight (внешнее состояние) должны быть унаследованы от Flyweight. Подобную структуру можно увидеть в Википедии.
Тем не менее, в моем следующем примере я не унаследовал Конкретный Цвет Веса Мухи от Формы Веса. Но вместо этого я использовал его как композицию Unshared Concrete Flyweight Circle.
Итак, мне интересно, если у меня есть действительный пример модели Deisgn Flyweight. В разделе тестирования вы можете заметить, что будут созданы только два объекта Color (черный и красный), и они будут разделены между объектами Circle, что является основным намерением шаблона проектирования Flyweight, верно?
from abc import ABC, abstractmethod
# Flyweight Factory
class Shape_Factory:
color_map = {}
@staticmethod
def get_color(color):
try:
color_obj = Shape_Factory.color_map[color]
except KeyError:
color_obj = Color(color)
Shape_Factory.color_map[color] = color_obj
print("Creating color: " + color)
return color_obj
# Flyweight
class Shape(ABC):
def __init__(self, color):
self.color_obj = Shape_Factory.get_color(color)
@abstractmethod
def draw(self):
pass
# Shared Flyweight
class Color:
color = ''
def __init__(self, color):
self.color = color
def __str__(self):
return self.color
# Unshared Concrete Flyweight
class Circle(Shape):
def __init__(self, color, x, y, radius):
super().__init__(color)
self.x = x
self.y = y
self.radius = radius
def draw(self):
print("Circle: \ncolor:", self.color_obj, "\nx:", self.x, "\ny:", self.y, "\nradius:", self.radius)
Тестирование:
my_circles = []
circle = Circle("black", x=10, y=20, radius=30)
circle.draw()
my_circles.append(circle)
print()
circle = Circle("black", x=40, y=50, radius=60)
circle.draw()
my_circles.append(circle)
print()
circle = Circle("red", x=70, y=80, radius=90)
circle.draw()
my_circles.append(circle)
print("\n\nMy circles:\n")
for circle in my_circles:
circle.draw()
print()