简单工厂 (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是抽象,但可能是界面?):
请注意,在您的第一张图中,SimplePizzaFactory 和 Pizza 之间的关系也是错误的,因为 SimplePizzaFactory 中没有属性来记忆实例Pizza,与 PizzaStore 具有保存 SimplePizzaFactory* 实例的属性相反,使用构造型的依赖关系 create 非常清楚。
【讨论】:
确实,即使它确实有意义,课程材料中的聚合也可能是错误的方式。客户端将聚合工厂,而不是相反! @muszeo 绝对 不错的一个!在回答了来自同一个 OP 的类似但更详细的问题后,我才发现它。我会知道吗,我会参考这个出色的答案吗!以上是关于简单工厂 (UML) 中的聚合或依赖的主要内容,如果未能解决你的问题,请参考以下文章