Агрегация или зависимость в простой фабрике (UML)

#python #design-patterns #uml #factory #aggregation

#python #шаблоны проектирования #uml #фабрика #агрегация

Вопрос:

В курсе, который я прохожу, PizzaStore используется simplePizzaFactory класс, который обрабатывает создание конкретной пиццы, описанный следующей схемой (как указано в материалах курса): введите описание изображения здесь

Код, который я переписал на python:

 # Pizza's superclass and it's subclasses are defined elswhere

class SimplePizzaFactory:
    def create_pizza(self,type_of_pizza):
        if type_of_pizza == "cheese":
            pizza = CheesePizza()
        elif type_of_pizza == "pepperoni":
            pizza = PepperoniPizza()

        elif type_of_pizza == "clam":
            pizza = ClamPizza()

        elif type_of_pizza == "viggie":
            pizza = ViggiePizza()
        else:
            raise Exception("You need to specify a type of pizza.")
        
        return pizza


class PizzaStore:
    def __init__(self, pizza_factory_obj):
        self.pizza_factory_obj = pizza_factory_obj

    def order_pizza(self,type_of_pizza):
        type_of_pizza = type_of_pizza.lower() 
        pizza = self.pizza_factory_obj.create_pizza(type_of_pizza) 
        pizza.prepare()
        pizza.bake()
        pizza.box()
        return pizza

print("========================================================")
factory = SimplePizzaFactory()
store = PizzaStore(factory)
store.order_pizza("Cheese")
store.order_pizza("viggie")

  

Вопрос:

Обобщено (из материала курса):

введите описание изображения здесь

Я бы понял, что первая стрелка — это агрегация (поскольку объект simplePizzaFactory создается и отправляется в PizzaStore в качестве аргумента), но как вторая стрелка также является агрегацией? не должно ли иметь больше смысла быть пунктирной стрелкой зависимости?

Я был бы признателен за дополнительные разъяснения по этой части, а также по моему пониманию, если я был неправ в отношении первой стрелки. Также приветствуются любые комментарии к коду

Ответ №1:

Я бы понял, что первая стрелка — это агрегация (поскольку объект simplePizzaFactory создается и отправляется в PizzaStore в качестве аргумента)

Это не потому, что конструктор (или любой другой метод) PizzaStore (клиент) получает экземпляр SimplePizzaFactory, что существует первая агрегация или даже простая ассоциация.

Для меня обе агрегации неверны.

  • SimpleFactory не знает, клиент его использует, поэтому, тем более, агрегации нет
  • продукт не знает SimpleFactory, создающий его, поэтому, тем более, агрегации нет.

Диаграмма может быть (пицца абстрактна, но, может быть, это интерфейс?):

введите описание изображения здесь

Обратите внимание, что на вашей первой диаграмме связь между SimplePizzaFactory и Pizza также неверна в том смысле, что в SimplePizzaFactory нет атрибута для запоминания экземпляров пиццы, в отличие от того, что у PizzaStore есть атрибут для сохранения экземпляра SimplePizzaFactory *, гораздо понятнее использовать зависимость, стереотипно созданную.

Комментарии:

1. Действительно, и даже если бы это имело смысл, агрегации в материалах курса, скорее всего, неверны. Клиент будет агрегировать фабрику, а не наоборот!

2. @muszeo абсолютно

3. Отличный вариант! Я только что обнаружил это после ответа на аналогичный, но более подробный вопрос из того же OP. Если бы я знал, я бы сослался на этот отличный ответ!