Python实现软件设计模式1:简单工厂/静态工厂模式

发布时间 2023-12-14 10:29:13作者: 爱吃砂糖橘的白龙

包含的角色

  • 工厂角色 Factory 静态方法
  • 抽象产品角色 Product 声明公用的抽象方法和属性
  • 具体产品角色 ConcreteProduct 覆盖抽象产品中声明的方法,多种产品多种覆盖

模式特点

  • 可以降低系统耦合度,使用工厂方法时无需知道对象创建细节,传入工厂类的参数可以是字符串、也可以是提前规定好的整型参数
  • 但是所有产品都由一个工厂来生产,工厂类的职责相对较重,添加新产品需要修改工厂类的判断逻辑,违背开闭原则
  • 适合生产较少产品类型的场景,这样工厂类中的控制逻辑比较简单

代码

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:
    @staticmethod
    def productTV(brand):        # 可以设置为静态方法
        if brand == 'Haier':
            print("TV工厂生产海尔电视机!")
            return HaierTV()
        elif brand == 'Huawei':
            print("TV工厂生产华为电视机!")
            return HuaweiTV()
        else:
            raise TypeError("There aren't this brand product.")
    
class Client:
    def __init__(self, brandName):
        self.brand = brandName

    def run(self):  
        # tv = TV()   # tv产品  定义为  抽象TV类
        # tf = TVFactory()  # 如果productTV不是静态方法则使用本条注释
        tv = TVFactory.productTV(self.brand)    # tf.productTV(self.brand)
        tv.play()

if __name__=='__main__':
    t1 = Client('Haier')
    t1.run() 

    t2 = Client('Huawei')
    t2.run() 

解释

Client类是客户端,传入一个参数,可以是字符串类型也可以是自定义的任意类型参数,针对性的生产不同的具体TV产品。python是动态语言,不需要像C++\Java一样声明变量的类型;因此在Java或C++形式的Client类的run方法中,tv需要预先声明为TV()类型的对象,后面被TVFactory()返回的具体类型所覆盖。