导言
为了克服简单工厂方法模式的缺点,人们试图改善工厂类的结构。导致简单工厂方法模式不符合开闭原则的原因是工厂方法类只是一个实类,每当有一个新的产品类被加入到产品类的结构中时,在工厂方法类中就必须增加适当的条件语句,以便能够在合适的条件下创建新增加的类的实例。经过以上分析,软件设计者们发现,可以将简单工厂方法模式中单一的工厂类改写为一个层次类来解决这个问题。首先需要一个接口作为超类,名为creator,接口中有一个方法,叫做factory();然后可以用产品类相同的结构产生创建者类结构,其中包含creatorA和creatorB,各自负责创建相应的ProductA和ProductB对象,如图所示。
在图中,每个产品类对应一个工厂类。该工厂类只负责创建相应的产品类对象,例如工厂类CreatorA只负责创建类ProductA的对象,而工厂类CreatorB只负责创建类ProductB对象。
from abc import ABC, abstractmethod
class Client:
@staticmethod
def main():
option = input("A:ProductA,B:ProductB\n请选择:").strip().upper()
creator = None
# 创建工厂子类对象creator
if option == 'A':
creator = CreatorA()
elif option == 'B':
creator = CreatorB()
# 调用工厂方法,获得一个具体的产品子类对象
product = creator.factory()
# 使用该产品子类对象做相应的操作
print(product.get_info())
# 以下类为工厂类接口及其实现子类。每个工厂子类仅仅负责创建一种产品对象。因此每个工厂子类都不包含条件语句。
class Creator(ABC):
@abstractmethod
def factory(self):
pass
class CreatorA(Creator):
def factory(self):
return ProductA()
class CreatorB(Creator):
def factory(self):
return ProductB()
# 以下类为产品接口及其实现子类
class Product(ABC):
@abstractmethod
def get_info(self):
pass
class ProductA(Product):
def get_info(self):
return'ProductA'
class ProductB(Product):
def get_info(self):
return'ProductB'
if __name__ == '__main__':
Client.main()
简单工厂方法模式与工厂方法模式的相同之处与简单工厂方法模式一样,工厂方法模式中的工厂方法也返回一个属于父类Product类型的对象,客户不必知道返回对象的具体类型。
简单工厂方法模式与工厂方法模式的区别如下:
在以下任何一种情况下,可以使用工厂方法模式。
工厂方法模式的优点如下:
本文分享自 Python机器学习算法说书人 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!