Python实现软件设计模式2:工厂方法模式

发布时间 2023-12-14 16:32:31作者: 爱吃砂糖橘的白龙

特点

  • 工厂存在父类和子类,产品存在父类和子类。
  • 工厂父类负责定义创建产品对象的公共接口,工厂子类负责生成具体的产品对象。

包含的角色

  • 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()

总结

  • 和简单工厂模式一样,它将对象的创建和使用分离,向客户用藏了哪种具体产品类型将被实例化这一细节,因为创建产品对象的细节完全封装在具体工厂内部;
  • 在系统中加入新产品时,完全符合开闭原则;
  • 系统中类的个数将成对增加,在一定程度上增加了系统的复杂度,给系统带来额外开销;