常见的设计模式(python)———工厂模式
源码前戏
承接上一篇(建造者模式)故事,话说,女娲正在造人,但是效率低下(毕竟神仙也只有一双手)
于是伟大的女娲think了一下,何不建造一个造人工厂,
说干就干,上源码:
造人工厂v1.0 ----简单工厂
"""简单工厂模式""" class MakeWoman: # 制造女人 """制造女人的具体实现""" def __init__(self, name): print("制造女人:" + name) ... class MakeMan: def __init__(self, name): print("制造男人:" + name) class KeyError(Exception): """自定义异常""" def __init__(self, code, massage): self.code = code self.massage = massage class WomanGod: """统一接口""" @staticmethod def person(sex, name): try: if sex == "女": MakeWoman(name) elif sex == "男": MakeMan(name) else: raise KeyError(0, "性别有问题") except KeyError as e: print(e.massage) if __name__ == "__main__": WomanGod.person("男", "张三") WomanGod.person("女", "王二妹") """ps:简单工厂模式适用于需创建的对象较少,不会造成工厂方法中的业务逻辑太过复杂的情况下,而且用户只关心那种类型的实例被创建,
并不关心其初始化过程时,比如多种数据库(MySQL/MongoDB)的实例,多种格式文件的解析器(XML/JSON)等。"""
现在好了,女娲只需要给每个人取名字,性别就行了...
in on time,问题出现了,由于长时间的给人类对象取名、性别,女娲感到无比的繁琐,枯燥,于是
何不改造一下,先造人,暂不取名,直接调方法
上代码
造人工厂v2.0 ----工厂方法模式
from abc import abstractmethod, ABCMeta class MakeMan: def __str__(self): return "制造女人" class MakeWoman: def __str__(self): return "制造男人" class Person(metaclass=ABCMeta): @abstractmethod def make_something(self): print("抽象类") # class WomanGod: # def make_woman(self): # return MakeWoman() # # def make_man(self): # return MakeMan() class Woman(Person): def make_something(self): # super().make_something() return MakeWoman() class Man(Person): def make_something(self): return MakeMan() if __name__ == "__main__": print(Woman().make_something()) """工厂方法模式 继承了简单工厂模式的优点又有所改进,其不再通过一个工厂类来负责所有产品的创建,
而是将具体创建工作交给相应的子类去做,这使得工厂方法模式可以允许系统能够更高效的扩展。实际应用中可以用来实现系统的日志系统等,
比如具体的程序运行日志,网络日志,数据库日志等都可以用具体的工厂类来创建。。"""
其他
""" 除了 简单工厂模式,工厂方法模式 还有一个叫抽象工厂模式 由于其与女娲故事线有偏差(其实是编不想去了),这里就做个索引 解释一下: 抽象工厂模式与工厂方法模式最大的区别在于, 抽象工厂中的一个工厂对象可以负责多个不同产品对象的创建 , 这样比工厂方法模式更为简单、有效率。 ps:抽象工厂模式在工厂方法基础上扩展了工厂对多个产品创建的支持, 更适合一些大型系统,比如系统中有多于一个的产品族, 且这些产品族类的产品需实现同样的接口, 像很多软件系统界面中不同主题下不同的按钮、文本框、字体等等。 """
最后
分享不宜,不喜勿喷,错误之处,欢迎指出,一起学习
故事线纯属瞎编,如有雷同,纯属巧合....