特点
- 工厂存在父类和子类,产品存在父类和子类。
- 工厂父类负责定义创建产品对象的公共接口,工厂子类负责生成具体的产品对象。
包含的角色
- Product 抽象产品
- ConcreteProduct 具体产品
- Factory 抽象工厂
- ConcreteFactory 具体工厂
模式分析
工厂方法模式是简单工厂模式的进一步抽象,核心的工厂类不在负责所有产品的创建,而是将具体的创建工作交给不同的子类去完成;增加具体产品==>增加具体工厂,符合“开闭原则”。
代码
from abc import ABC,abstractmethod
class TV(ABC): # 抽象产品
@abstractmethod
def play(self):
pass
class HaierTV(TV): # 具体产品1
def play(self):
print(f"海尔电视播放中...")
class HuaweiTV(TV): # 具体产品2
def play(self):
print(f"华为电视播放中...")
class TVFactory(ABC): # 抽象工厂
@abstractmethod
def productTV(self):
pass
class HaierTVFactory(TVFactory):
def productTV(self):
print("海尔TV工厂生产海尔电视机!")
return HaierTV()
class HuaweiTVFactory(TVFactory):
def productTV(self):
print("华为TV工厂生产华为电视机!")
return HuaweiTV()
class Client:
def __init__(self, pname):
self.product = pname # 可以从配置文件读取,也可以用户在main函数中创建对象时输入
def run(self):
try:
factory = eval(self.product)() # 字符串名称 转 具体产品工厂对象
tv = factory.productTV()
tv.play()
except NameError as e:
print(f"Error! Product '{self.product}' doesn't exits...")
if __name__ == '__main__':
t1 = Client('HaierTVFactory')
t1.run()
t2 = Client('HuaweiTVFactory')
t2.run()
总结
- 和简单工厂模式一样,它将对象的创建和使用分离,向客户用藏了哪种具体产品类型将被实例化这一细节,因为创建产品对象的细节完全封装在具体工厂内部;
- 在系统中加入新产品时,完全符合开闭原则;
- 系统中类的个数将成对增加,在一定程度上增加了系统的复杂度,给系统带来额外开销;