• 工厂方法设计模式是什么?什么是 Factory Method 工厂方法设计模式?Python 工厂方法设计模式示例代码


    什么是 Factory Method 工厂方法设计模式?

    工厂方法(Factory Method)是一种创建型设计模式,它定义了一个创建对象的接口,但将实际的实例化工作延迟到子类中。这样,可以使一个类的实例化延迟到其子类,让子类决定实例化哪个类。

    在这里插入图片描述

    主要角色:

    1. 抽象产品(Product): 定义了产品的抽象类或接口,是工厂方法创建的对象的共同接口。

    2. 具体产品(Concrete Product): 实现了抽象产品接口的具体对象。

    3. 抽象工厂(Creator): 声明了创建产品对象的工厂方法,是工厂方法模式的核心,也可以是一个抽象类或接口。

    4. 具体工厂(Concrete Creator): 实现了抽象工厂中的工厂方法,负责创建具体的产品对象。

    在这里插入图片描述

    工作流程:

    1. 定义抽象产品: 创建一个产品接口或抽象类,声明产品的共同方法。

    2. 实现具体产品: 创建具体的产品类,实现抽象产品接口。

    3. 定义抽象工厂: 声明一个抽象工厂类,其中包含一个工厂方法用于创建产品。

    4. 实现具体工厂: 实现抽象工厂中的工厂方法,根据需求创建具体的产品对象。

    5. 客户端使用工厂方法: 客户端通过调用具体工厂的工厂方法来创建产品,不直接与具体产品类耦合。

    优点:

    1. 符合开闭原则: 工厂方法模式通过抽象工厂和具体工厂的分离,使得增加新产品类型更容易,符合开闭原则,不需要修改现有代码。

    2. 降低耦合度: 客户端代码与具体产品的实现解耦,只依赖于抽象工厂和抽象产品,提高了系统的灵活性。

    3. 可扩展性高: 可以很容易地添加新的产品类型,只需要增加对应的具体工厂类和产品类,无需修改其他现有代码。

    4. 可维护性强: 因为每个具体产品的创建逻辑都在各自的具体工厂类中,使得代码的维护更加方便。

    缺点:

    1. 类的数量增加: 随着产品类型的增加,可能会导致具体工厂和产品类的数量激增,使得类的数量增加。

    2. 增加了系统复杂性: 引入了更多的抽象和接口,可能会增加系统的复杂性和理解难度,增加了代码的抽象层次。

    3. 不适用于简单情景: 如果产品类型较少,而且不需要频繁增加新的产品类型,使用工厂方法可能显得繁琐,不划算。

    4. 创建实例开销: 在创建大量对象时,可能会增加额外的开销,因为需要通过工厂来创建对象。

    总体来说,工厂方法模式适用于需要创建多种类型对象、需要灵活扩展、需要降低系统耦合度的场景,但在简单情景下使用可能会增加不必要的复杂性。在实际应用中需要根据具体情况选择是否使用该模式。


    Python 实现工厂方法设计模式示例代码(一):

    假设有一个简单的图表库,可以创建不同类型的图表(柱状图、折线图等)并绘制。这里使用工厂方法模式创建不同类型的图表。

    from abc import ABC, abstractmethod
    
    # 抽象产品 - 图表
    class Chart(ABC):
        @abstractmethod
        def draw(self):
            pass
    
    # 具体产品 - 柱状图
    class BarChart(Chart):
        def draw(self):
            print("Drawing bar chart")
    
    # 具体产品 - 折线图
    class LineChart(Chart):
        def draw(self):
            print("Drawing line chart")
    
    # 抽象工厂
    class ChartFactory(ABC):
        @abstractmethod
        def create_chart(self) -> Chart:
            pass
    
    # 具体工厂 - 创建柱状图
    class BarChartFactory(ChartFactory):
        def create_chart(self) -> Chart:
            return BarChart()
    
    # 具体工厂 - 创建折线图
    class LineChartFactory(ChartFactory):
        def create_chart(self) -> Chart:
            return LineChart()
    
    if __name__ == "__main__":
        # 客户端
        bar_factory = BarChartFactory()
        bar_chart = bar_factory.create_chart()
        bar_chart.draw()  # 输出:Drawing bar chart
    
        line_factory = LineChartFactory()
        line_chart = line_factory.create_chart()
        line_chart.draw()  # 输出:Drawing line chart
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43

    在这个示例中,Chart 是抽象产品接口,定义了图表的绘制方法。BarChartLineChart 是具体产品类,分别表示柱状图和折线图。ChartFactory 是抽象工厂接口,包含了一个创建图表的抽象方法。BarChartFactoryLineChartFactory 是具体工厂类,分别实现了创建柱状图和折线图的工厂方法。客户端通过具体工厂的工厂方法来创建特定类型的图表。


    Python 实现工厂方法设计模式示例代码(二):

    假设你正在开发一个游戏,需要不同的工厂来创建不同类型的武器。这里使用工厂方法模式来创建不同类型的武器。

    from abc import ABC, abstractmethod
    
    # 抽象产品 - 武器
    class Weapon(ABC):
        @abstractmethod
        def attack(self):
            pass
    
    # 具体产品 - 刀
    class Knife(Weapon):
        def attack(self):
            print("Using knife to attack")
    
    # 具体产品 - 枪
    class Gun(Weapon):
        def attack(self):
            print("Using gun to attack")
    
    # 抽象工厂
    class WeaponFactory(ABC):
        @abstractmethod
        def create_weapon(self) -> Weapon:
            pass
    
    # 具体工厂 - 创建刀
    class KnifeFactory(WeaponFactory):
        def create_weapon(self) -> Weapon:
            return Knife()
    
    # 具体工厂 - 创建枪
    class GunFactory(WeaponFactory):
        def create_weapon(self) -> Weapon:
            return Gun()
    
    if __name__ == "__main__":
        # 客户端
        knife_factory = KnifeFactory()
        knife = knife_factory.create_weapon()
        knife.attack()  # 输出:Using knife to attack
    
        gun_factory = GunFactory()
        gun = gun_factory.create_weapon()
        gun.attack()  # 输出:Using gun to attack
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43

    这个示例模拟了游戏中不同类型武器的创建。Weapon 是抽象产品,定义了武器的攻击方法。KnifeGun 是具体产品类,分别表示刀和枪。WeaponFactory 是抽象工厂接口,包含了一个创建武器的抽象方法。KnifeFactoryGunFactory 是具体工厂类,分别实现了创建刀和枪的工厂方法。客户端通过具体工厂的工厂方法来创建特定类型的武器。


    使用工厂方法设计模式时,需要注意哪些地方?

    在使用工厂方法设计模式时,需要注意以下几个方面:

    1. 扩展性: 工厂方法模式是为了解决创建对象的问题,要确保系统具有良好的扩展性,能够方便地添加新的产品类型或工厂。

    2. 产品族和产品等级结构: 要根据实际需求合理设计产品族和产品等级结构,确保抽象工厂和产品的设计符合业务逻辑。

    3. 单一职责原则: 每个具体工厂类应该只负责创建一种产品,符合单一职责原则,避免一个工厂类负责过多产品的创建。

    4. 依赖倒置原则: 针对抽象类型编程,依赖于接口而不是具体实现,确保客户端代码与具体产品类解耦。

    5. 合理命名: 工厂方法、产品类、工厂类的命名应该清晰易懂,能够清晰表达其作用和职责。

    6. 考虑性能: 在创建大量对象时,工厂方法可能会增加额外的开销,需要考虑其对性能的影响。

    7. 设计模式选择: 工厂方法模式并不是适用于所有场景的最佳解决方案,需要根据实际情况选择合适的设计模式。

    8. 遵循设计原则: 保持设计模式的灵活性和简洁性,遵循设计原则,避免过度设计。

    总的来说,使用工厂方法模式时需要考虑扩展性、结构设计、原则遵循以及性能等方面的问题,合理设计和组织工厂结构,确保系统易于扩展和维护。


    本文就到这里了,感谢您的阅读 。别忘了点赞、收藏~ Thanks♪(・ω・)ノ 🍇

  • 相关阅读:
    python模块详解
    [附源码]JAVA毕业设计工程车辆动力电池管理系统(系统+LW)
    重温C语言八----程序流程控制
    【Gradle】四、使用Gradle创建SringBoot微服务项目
    C#中的访问修饰符知识点
    kafka ack确认机制
    【SQL】MySQL中的SQL优化、explain执行计划
    多线程之四(锁策略+CAS+synchronized)
    iframe的src可以引入任何源,但是二者如果想通信的话,必须是同源,如果是非同源,如何解决?
    iTOP-RK3588开发板rknn_multiple_input_demo 体验
  • 原文地址:https://blog.csdn.net/Backli/article/details/134541794