Python实现软件设计模式1:简单工厂/静态工厂模式
工厂负责生产所有的产品,根据传入参数的不同,返回不同的产品对象。
包含的角色
- 工厂角色 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()返回的具体类型所覆盖。