今日分享主题:Python 工厂方法模式
工厂,大家一般能想到的是生产产品的地方,在设计模式中,工厂可分为:简单工厂模式、工厂方法模式。在前期推文 Python 简单工厂模式 中有关于简单工厂模式的解读。
根据工厂的抽象程度可分为:工厂方法模式、抽象工厂模式。该模式用于封装和管理对象的创建,是一种创建型模式。
背景
在简单工厂模式中,只提供了一个工厂类,该工厂类处于对产品类进行实例化的中心位置,它知道每一个产品对象的创建细节,并决定何时实例化哪一个产品类。
简单工厂模式最大的缺点是:当有新产品要加入到系统中时,必须修改工厂类,加入必要的处理逻辑,这违背了“开闭原则”。
在简单工厂模式中,所有的产品都是由同一个工厂创建,工厂类职责较重,业务逻辑较为复杂,具体产品与工厂类之间的耦合度高,严重影响了系统的灵活性和扩展性,而工厂方法模式则可以很好地解决这一问题。因此工厂方法模式应运而生。
说明
(1)、工厂方法模式定义一个用于创建对象的接口,但是工厂本身并不负责创建对象,而是让子类决定将哪一个类实例化。工厂方法模式让一个类的实例化延迟到其子类。工厂方法的创建是通过继承而不是通过实例化来完成的。
(2)、工厂方法模式就是简单工厂模式的进一步抽象。由于面向对象多态性,工厂方法模式保持了简单工厂的优点同时克服了它的缺点。工厂方法模式中,核心的工厂被提升为一个抽象类,将具体的创建工作交给他的子类完成。
这个抽象的工厂类仅规定具体工厂实现的接口,而不明确指出如何实例化一个产品类,这使得工厂方法模式允许系统在不修改原有产品结构的情况下轻松的引进新产品。
工厂方法使设计更加具有可定制性,它可以返回相同的实例或子类,而不是某种类型的对象。
Python 实现源码
1from abc import ABCMeta,abstractmethod
2
3class Person(metaclass=ABCMeta):
4 @abstractmethod
5 def show(self):
6 pass
7
8class ManOfPerson(Person):
9 def show(self):
10 print("man show power")
11
12class WomanOfPerson(Person):
13 def show(self):
14 print("woman show beautiful")
15
16class ChildOfPerson(Person):
17 def show(self):
18 print("child show toy")
19
20
21class Family(metaclass=ABCMeta):
22 def __init__(self):
23 self.member=[]
24 self.createshow()
25
26 @abstractmethod
27 def createshow(self):
28 pass
29
30 def getmember(self):
31 return self.member
32
33 def addmember(self,oneperson):
34 self.member.append(oneperson)
35
36class TomFamily(Family):
37 def createshow(self):
38 self.addmember(ManOfPerson)
39 self.addmember(WomanOfPerson)
40
41class JimFamily(Family):
42 def createshow(self):
43 self.addmember(ManOfPerson)
44 self.addmember(ChildOfPerson)
45
46if __name__ == '__main__':
47 family_type=eval("TomFamily")()
48 print("create show ..",type(family_type).__name__)
49 print("family has member--",family_type.getmember())
执行结果
1 create show .. TomFamily
2 family has member-- [<class '__main__.ManOfPerson'>, <class '__main__.WomanOfPerson'>]
总结
前期分享的 Python 简单工厂模式 和今天分享的Python 工厂方法模式,大家在实际应用时能解决问题满足需求即可,可灵活变通,自由选择,无所谓哪种设计模式更高级。
同时无论哪种设计模式,由于可能封装了大量对象和工厂创建,当有新加入产品的需求时,需要修改已定义好的工厂相关的类,因此对于产品和工厂的扩展性不太友好,在选择使用时利弊需要权衡一下。
欢迎关注【无量测试之道】公众号,回复【领取资源】,
Python编程学习资源干货、
Python+Appium框架APP的UI自动化、
Python+Selenium框架Web的UI自动化、
Python+Unittest框架API自动化、
资源和代码 免费送啦~
文章下方有公众号二维码,可直接微信扫一扫关注即可。
备注:我的个人公众号已正式开通,致力于测试技术的分享,包含:大数据测试、功能测试,测试开发,API接口自动化、测试运维、UI自动化测试等,微信搜索公众号:“无量测试之道”,或扫描下方二维码:
添加关注,让我们一起共同成长!