工厂模式(FactoryPattern)定义定义一个用于创建对象的接口,但是让子类决定实例化哪个类。工厂方法让一个类将实例化推迟到子类。(定义一个使用创建对象的接口,让子类决定实例化哪个类。工厂方法将一个类的实例化延迟到它的子类。)对于python这种在运行时判断类型的脚本语言来说,它是一个简单的工厂方法,屏蔽了通过工厂方法创建相应的子类。UML实例@startumlclassNvWanoteleft:NvwaabstractclassAbstractHumanFactroy{HumancreateHuman(Classc)}noteleft:abstractgossipstoveinterfaceHuman{+voidgetColor()+voidtalk()}noteleft:HumanNvWa-->AbstractHumanFactroyNvWa-->HumanAbstractHumanFactroy..>HumanClassHumanFactoryclassBlackHumannote底部:BlackHumanclassYellowHumannote底部:YellowHumanclassWhiteHumannote底部:WhiteHumanAbstractHumanFactroy<|--HumanFactoryHuman<|..BlackHumanHuman<|..YellowHumanHuman<|..WhiteHuman@enduml代码实现了图中所示的uml类之间的关系。由于python中没有接口的概念,而uml将接口定义为所有人类的实现,因此在python中的表示就是各个具体类的定义。静态语言中有接口和抽象类,而python中的类型是在运行时检查的,所以有一些区别,看起来比较简单。举个例子:关于代码中的工厂类,其实在java中,它只是定义了一个静态方法的工厂工厂,这和这里直接用工厂方法来表达是一样的。类BlackHuman:def__init__(self):returndeftalk(self):print("I'mblcakhuman")defgetColor(self):print("Black")classWhiteHuman:def__init__(self):returndeftalk(self):print("我是白人")defgetColor(self):print("White")classYellowHuman:def__init__(self):returndeftalk(self):print("我是黄人")defgetColor(self):print("Yellow")defcreate_human(selector):如果选择器=='black':返回BlackHuman()如果selector=='white':返回WhiteHuman()如果选择器=='yellow':returnYellowHuman()returnValueError("selectoriswrong")if__name__=="__main__":#NvWacreatedhumanblackhuman=create_human('black')whitehuman=create_human('white')yellowhuman=create_human('yellow')blackhuman.getColor()whitehuman.getColor()yellowhuman.getColor()知识点简单工厂使用的方法比较简单,但是需要注意的是应用场景,个人理解是任何人都想创建一个封闭的对于特定对象,您可以使用简单工厂。比如连接数据库时,连接不同的数据库,返回该数据库对应的对象。此时通过工厂方法屏蔽了具体的创建细节;只是根据传入的参数的类型来判断。再比如:根据不同的文件后缀创建不同文件类型的对象,并解析对应的文件类型。参考《精通 python 设计模式》第一章工厂模式之工厂方法参考《设计模式之禅》下一集预告:抽象工厂模式
