简单工厂 (UML) 中的聚合或依赖

Posted

技术标签:

【中文标题】简单工厂 (UML) 中的聚合或依赖【英文标题】:Aggregation or Dependency in the Simple Factory (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 也将不胜感激

【问题讨论】:

【参考方案1】:

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

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

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

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

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

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

【讨论】:

确实,即使它确实有意义,课程材料中的聚合也可能是错误的方式。客户端将聚合工厂,而不是相反! @muszeo 绝对 不错的一个!在回答了来自同一个 OP 的类似但更详细的问题后,我才发现它。我会知道吗,我会参考这个出色的答案吗!

以上是关于简单工厂 (UML) 中的聚合或依赖的主要内容,如果未能解决你的问题,请参考以下文章

3.简单工厂模式工厂方法模式与抽象工厂模式

Java学习笔记——对比简单工厂模式和策略模式

一. 抽象工厂&工厂方法&简单工厂方法

工厂模式:简单工厂工厂方法抽象工厂

设计模式工厂方法模式

《疯狂学习之Java设计模式之简单工厂模式》