#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. Если бы я знал, я бы сослался на этот отличный ответ!