欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

python 设计模式之工厂模式、抽象工厂模式

程序员文章站 2022-04-30 12:02:15
...

python 设计模式之工厂模式、抽象工厂模式

1、工厂模式
  • 定义:

    • 定义一个用于创建对象的函数,让子类决定实例化哪一个类。工厂模式使一个类的实例化延迟到其子类。
  • 优点:

    • 良好的封闭性,代码结构清晰。一个对象的创建是有条件约束的,入一个调用者需要一个具体的产品对象,只要知道这个产品的类名(或约束字符串)就可以了,不用知道创建者的艰辛过程,降低模块间的耦合。
    • 工厂模式的扩展性非常优秀。在增加产品类的情况下,只要适当地修改具体的工厂类或扩展一个工厂类,就可以完成 “拥抱变化”。
    • 屏蔽产品类。一个产品对象具体由哪一个产品生成是由工厂类决定的。
    • 工厂模式是典型的解耦框架。
  • 工厂模式案例:

    #! /usr/bin/env python
    # -*- coding: utf-8 -*-
    
    
    class A:
    
        def __init__(self):
            self.word = "运行A"
    
        def run(self):
            print(self.word)
    
    
    class B:
    
        def __init__(self):
            self.word = "运行B"
    
        def run(self):
            print(self.word)
    
    
    def interface(classname):
        """
        工厂模式接口函数
        :param classname:
        :return:
        """
        run = dict(A=A, B=B)
        return run[classname]()
    
    
    if __name__ == '__main__':
        test1 = interface('A')
        test1.run()
        test2 = interface('B')
        test2.run()
        
        运行结果:
        运行A
        运行B
    2、抽象工厂模式
    
2、抽象工厂模式
  • 定义:

    • 为创建一组相关或互相依赖的对象提供一个接口,而且无需指定它们的具体类。(抽象工厂模式是工厂模式的升级版本)
  • 优点:

    • 封装性,每个产品的实现不是高层模块需要关心的,只要知道工厂类是谁,就能创建出一个需要的对象。
    • 产品族内的约束为非公开状态。
  • 缺点:

    • 产品族扩展非常困难。因为每次扩展都需要修改抽象类。
  • 抽象工厂模式案例:

    #! /usr/bin/env python
    # -*- coding: utf-8 -*-
    
    
    class A:
    
        def __init__(self):
            self.word = "运行A"
    
        def run(self):
            print(self.word)
    
    
    class B:
    
        def __init__(self):
            self.word = "运行B"
    
        def run(self):
            print(self.word)
    
    
    class Interface:
        """
        抽象工厂模式接口类
        :param classname:
        :return:
        """
    
        def __init__(self, classname=None):
            self.test = classname
    
        def run(self):
            self.test().run()
    
    
    if __name__ == '__main__':
        test1 = Interface()
        test1.test = A
        test1.run()
        test1.test = B
        test1.run()
    
        # 结果:
        # 运行A
        # 运行B