Пример шаблона конструкции для навесного веса

Согласно шаблону "Банды четырех", структура шаблона проектирования 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()

0 ответов

Другие вопросы по тегам