zoukankan      html  css  js  c++  java
  • 常见的设计模式(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:抽象工厂模式在工厂方法基础上扩展了工厂对多个产品创建的支持,
    更适合一些大型系统,比如系统中有多于一个的产品族,
    且这些产品族类的产品需实现同样的接口,
    像很多软件系统界面中不同主题下不同的按钮、文本框、字体等等。
    """

    最后

    分享不宜,不喜勿喷,错误之处,欢迎指出,一起学习

    故事线纯属瞎编,如有雷同,纯属巧合....

  • 相关阅读:
    转载 分享探讨程序员的最后归宿!
    Java切换JDK版本时遇到的小错误。
    LR学习笔记16-LR脚本调试
    LR学习笔记15-LR的错误处理
    LR学习笔记14-脚本编写实践过程
    LR学习笔记13-Run-Time Settings设置
    LR学习笔记12-测试脚本的增强方法
    LR学习笔记11-LR自动关联
    LR学习笔记10-HTML和URL比较
    LR学习笔记9-回放测试脚本
  • 原文地址:https://www.cnblogs.com/jum-bolg/p/13369865.html
Copyright © 2011-2022 走看看