【问题标题】:Aggregation or Dependency in the Simple Factory (UML)简单工厂 (UML) 中的聚合或依赖
【发布时间】:2020-12-27 08:10:17
【问题描述】:

在我正在学习的一门课程中,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)但是第二个箭头如何也是聚合?做一个虚线的依赖箭头不应该更有意义吗?

如果我对第一个箭头的理解不正确,我希望能对此部分和我的理解进行更多澄清。 代码上的任何 cmets 也将不胜感激

【问题讨论】:

    标签: python design-patterns uml factory aggregation


    【解决方案1】:

    我知道第一个箭头是聚合(因为创建了 simplePizzaFactory 的对象并将其作为参数发送到 PizzaStore)

    这不是因为 PizzaStore (Client) 的构造函数(或任何其他方法)接收到的 SimplePizzaFactory 实例是第一个聚合,甚至不是简单的关联。

    对我来说,这两种聚合都是错误的。

    • SimpleFactory 不知道 Client 使用它,因此更何况没有聚合
    • Product 不知道创建它的 SimpleFactory,因此更何况没有聚合。

    图表可以是(Pizza抽象,但可能是界面?):

    请注意,在您的第一张图中,SimplePizzaFactoryPizza 之间的关系也是错误的,因为 SimplePizzaFactory 中没有属性来记忆实例Pizza,与 PizzaStore 具有保存 SimplePizzaFactory* 实例的属性相反,使用构造型的依赖关系 create 非常清楚。

    【讨论】:

    • 确实,即使它确实有意义,课程材料中的聚合也可能是错误的方式。客户端将聚合工厂,而不是相反!
    • @muszeo 绝对
    • 不错的一个!在回答了来自同一个 OP 的类似但更详细的问题后,我才发现它。我会知道吗,我会参考这个出色的答案吗!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-07
    • 2012-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多