Python 这是否可以被视为工厂方法模式(或等效模式)?
在我正在学习的一门课程中,一个Python 这是否可以被视为工厂方法模式(或等效模式)?,python,uml,aggregation,factory-pattern,Python,Uml,Aggregation,Factory Pattern,在我正在学习的一门课程中,一个PizzaStore,它使用一个SimplePizzaFactory类来处理具体的pizza实例化,描述如下: 在本课程中,通过介绍需要为PizzaStore提供额外级别的特殊性以及提供相同类型的Pizza(Viggie、Cheese等)但以NY风格和Chicago风格的能力来介绍factory方法模式,因此我们有了一组新的子类(NYSTYLEVIGGEIPIZA,NYStyleCheesePizza,…芝加哥风格VIGGEIPIZA,芝加哥风格CHEESEPIZ
PizzaStore
,它使用一个SimplePizzaFactory
类来处理具体的pizza实例化,描述如下:
在本课程中,通过介绍需要为PizzaStore提供额外级别的特殊性以及提供相同类型的Pizza(Viggie、Cheese等)但以NY风格和Chicago风格的能力来介绍factory方法模式,因此我们有了一组新的子类(NYSTYLEVIGGEIPIZA,NYStyleCheesePizza,…芝加哥风格VIGGEIPIZA,芝加哥风格CHEESEPIZZA,…)
讲师介绍的解决方案是使用工厂方法模式,如下所示:
(统一建模语言)
用python重新编写的代码:
比萨饼子类在别处定义
从abc导入abc,abstractmethod
等级比萨饼店(ABC):
@抽象方法
def创建_比萨饼(自我):
通过
def订购比萨饼(自身、比萨饼类型):
比萨饼的类型=比萨饼的类型。下()
比萨饼=自我。创建比萨饼(比萨饼类型)
比萨饼
比萨饼
比萨饼盒
回程披萨
类别:比萨店(比萨店):
def创建比萨饼(自我,比萨饼类型):
如果比萨饼的类型=“奶酪”:
比萨饼=NYStyleCheesePizza()
elif type of pizza==“辣味香肠”:
比萨饼
elif类型的比萨饼==“蛤蜊”:
比萨饼
elif类型的比萨饼==“viggie”:
比萨饼
其他:
引发异常(“您需要指定一种类型的NY pizza。”)
回程披萨
芝加哥比萨店(比萨店)等级:
def创建比萨饼(自我,比萨饼类型):
如果比萨饼的类型=“奶酪”:
比萨饼=ChicagoStyleCheesePizza()
elif type of pizza==“辣味香肠”:
比萨饼=芝加哥比萨饼()
elif类型的比萨饼==“蛤蜊”:
比萨饼=芝加哥比萨饼()
elif类型的比萨饼==“viggie”:
比萨饼=芝加哥风格的比萨饼()
其他:
引发异常(“您需要指定一种类型的NY pizza。”)
回程披萨
#====驱动程序代码=====
#纽约商店
纽约比萨店=纽约比萨店()
纽约比萨饼店。订购比萨饼(“奶酪”)
纽约比萨店。点比萨(“意大利香肠”)
打印()
#芝加哥商店
芝加哥比萨店=芝加哥比萨店()
芝加哥比萨店。订购比萨(“奶酪”)
芝加哥比萨店。点比萨(“辣香肠”)
在使用factory方法之前,我尝试了以下设计,我保持了PizzaStore的原样,并用两个新类替换了SimpleFactoryPizza
,NYPizzaFactory
和ChicagoPizzaFactory
用python重新编写的代码:
class NYPizzaFactory():
def创建比萨饼(自我,比萨饼类型):
如果比萨饼的类型=“奶酪”:
比萨饼=NYStyleCheesePizza()
elif type of pizza==“辣味香肠”:
比萨饼
elif类型的比萨饼==“蛤蜊”:
比萨饼
elif类型的比萨饼==“viggie”:
比萨饼
其他:
引发异常(“您需要指定一种类型的NY pizza。”)
回程披萨
类ChicagoPizzaFactory():
def创建比萨饼(自我,比萨饼类型):
如果比萨饼的类型=“奶酪”:
比萨饼=ChicagoStyleCheesePizza()
elif type of pizza==“辣味香肠”:
比萨饼=芝加哥比萨饼()
elif类型的比萨饼==“蛤蜊”:
比萨饼=芝加哥比萨饼()
elif类型的比萨饼==“viggie”:
比萨饼=芝加哥风格的比萨饼()
其他:
引发异常(“您需要指定一种类型的NY pizza。”)
回程披萨
#比萨饼店和以前一样
类别比萨饼店:
定义初始(自我,比萨饼工厂):
self.pizza\u factory\u obj=pizza\u factory\u obj
def订购比萨饼(自身、比萨饼类型):
比萨饼的类型=比萨饼的类型。下()
pizza=self.pizza\u工厂\u对象创建\u pizza(类型\u pizza)
比萨饼
比萨饼
比萨饼盒
回程披萨
#====驱动程序代码======
#纽约商店
纽约比萨工厂=纽约比萨工厂()
纽约比萨饼店=比萨饼店(纽约比萨饼厂)
纽约比萨饼店。订购比萨饼(“奶酪”)
打印()
纽约比萨店。点比萨(“意大利香肠”)
打印()
#芝加哥商店
芝加哥比萨工厂=芝加哥比萨工厂()
芝加哥比萨饼店=比萨饼店(芝加哥比萨饼厂)
芝加哥比萨店。订购比萨(“奶酪”)
打印()
芝加哥比萨店。点比萨(“辣香肠”)
我知道工厂方法允许类将实例化延迟到其子类,其中这些子类将包括“工厂方法”的实现
问题1:
- 根据定义,我的解决方案不被视为工厂模式吗?与所代表的工厂方法相比,我尝试的方法有哪些区别和缺点
- 工厂和产品之间的箭头表示课程材料中的“聚合”,而书中的UML图表示“依赖关系”(我想),哪一个表示正确的关系,为什么