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

最后

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

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

posted @ 2020-07-24 03:59  jum_blog  阅读(237)  评论(0编辑  收藏  举报

载入天数...载入时分秒...