当前位置: 首页 > article >正文

创建型设计模式-工厂模式(Factory Pattern)- python实现

设计模式汇总:查看

工厂模式(Factory Pattern)是软件设计中常用的一种创建型设计模式,它的主要目的是用于创建对象,同时隐藏创建逻辑,而不是通过直接使用new运算符实例化对象,这样可以提高程序的灵活性。

工厂模式的核心组成

抽象产品(Product):定义了产品的接口,描述了所有实例化对象的共同操作。

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

抽象工厂(Factory):提供了一个用于创建产品的接口,它通常包含一个工厂方法,此方法返回一个产品类型的实例。

具体工厂(Concrete Factory):实现了抽象工厂的工厂方法,决定了具体创建哪一个产品类。

工厂模式的分类

  • 简单工厂模式:一个工厂类负责创建所有类型的产品,客户端通过参数来决定创建哪种产品。
  • 工厂方法模式:定义了一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。
  • 抽象工厂模式:提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。
    具体参考:抽象工厂模式-python实现

工厂模式的用途

  • 当一个类不知道它必须创建哪些具体的对象时。
  • 当一个类希望由其子类来指定创建的对象时。
  • 当类将创建的对象集合起来,以实现特定的工厂方法时。

工厂模式的优点

  • 解耦:减少了客户代码和具体产品类之间的直接依赖关系。
  • 扩展性:新增产品类时,不需要修改已有系统代码。
  • 维护性:集中创建逻辑,易于维护。

Python中的工厂模式示例

以下是一个工厂方法模式的Python示例:

from abc import ABC, abstractmethod


class Creator(ABC):

    @abstractmethod
    def factory_method(self):
        """
        定义了一个工厂方法的接口。

        该方法是一个抽象方法,旨在被子类实现。子类应该根据自己的需求覆盖这个方法,
        提供具体的对象创建逻辑。工厂方法的设计模式允许子类决定实例化哪一个类,
        从而使系统更具可扩展性和灵活性。

        返回:
            无具体返回值,但子类实现时应该返回一个对象,该对象的类型是根据子类的实现决定的。
        """
        pass

    def some_operation(self):
        """
        执行特定操作,该操作涉及到使用工厂方法创建的产品。

        本方法展示了一个典型的使用工厂方法模式的场景,其中创建了一个产品对象,并使用该对象执行了一些操作。
        返回的结果字符串中包含了产品执行操作后的信息,强调了同一创建者创建的产品可以无缝协作。

        返回:
            一个字符串,包含了操作的结果和产品信息。
        """
        # 使用工厂方法获取产品实例
        product = self.factory_method()
        # 构造操作结果的字符串,强调了产品之间的协作关系
        result = f"Creator: The same creator's code has just worked with {product.operation()}"
        return result


class ConcreteCreator1(Creator):
    """
    具体创建者1类,继承自Creator类。
    它实现了Creator类中的工厂方法,返回一个具体的产品1。
    """
    def factory_method(self):
        """
        生产具体产品1。

        返回:
        ConcreteProduct1: 具体产品1的实例。
        """
        return ConcreteProduct1()


class ConcreteCreator2(Creator):
    """
    具体创建者2类,继承自Creator类。
    它实现了Creator类中的工厂方法,返回一个具体的产品2。
    """
    def factory_method(self):
        """
        生产具体产品2。

        返回:
        ConcreteProduct2: 具体产品2的实例。
        """
        return ConcreteProduct2()


class Product(ABC):
    """
    产品类的抽象基类。

    该类为所有具体产品类的父类,定义了产品类必须实现的操作。
    """

    @abstractmethod
    def operation(self):
        """
        抽象方法,具体产品类必须实现该方法。

        该方法定义了产品类的共同行为,每个具体产品类都需要根据自己的特点实现该方法。
        """
        pass


class ConcreteProduct1(Product):
    """
    具体产品1类,实现了产品接口。
    这个类代表了产品的一种具体实现,ConcreteProduct1提供了特定的operation方法实现。
    """
    def operation(self):
        """
        执行具体操作。
        """
        return "{Result of ConcreteProduct1}"


class ConcreteProduct2(Product):
    """
    具体产品2类,实现了产品接口。
    这个类代表了产品的一种具体实现,ConcreteProduct2提供了另一种特定的operation方法实现。
    """
    def operation(self):
        """
        执行具体操作。
        """
        return "{Result of ConcreteProduct2}"


if __name__ == "__main__":
    # 创建具体创建者1
    creator1 = ConcreteCreator1()
    # 使用创建者1创建产品
    result1 = creator1.some_operation()
    print(result1)

    # 创建具体创建者2
    creator2 = ConcreteCreator2()
    # 使用创建者2创建产品
    result2 = creator2.some_operation()
    print(result2)

http://www.kler.cn/a/293706.html

相关文章:

  • 在Flutter中,禁止侧滑的方法
  • 大数据 ETL + Flume 数据清洗 — 详细教程及实例(附常见问题及解决方案)
  • git commit 校验
  • RAFT: Recurrent All-Pairs Field Transforms for Optical Flow用于光流估计的循环全对场变换
  • windows C#-LINQ概述
  • 综合案例铁锅炖(CSS项目大杂烩)
  • 【动态规划】【完全背包】力扣322. 零钱兑换
  • 家庭教育系列—投资理财
  • Vue双向绑定
  • 常见面试1
  • 久久派简单搭建小游戏网站
  • 开源 AI 智能名片 S2B2C 商城小程序在社区团购中的应用与价值
  • 滚雪球学MyBatis-Plus(04):基础配置
  • Python 数据分析— Pandas 基本操作(中)
  • 回溯——7.子集II
  • IOS17.0安装巨魔:TrollRestore巨魔发布
  • 黑神话:游戏的诞生
  • 【C++ 面试 - 新特性】每日 3 题(五)
  • Mac 数据恢复技巧:恢复 Mac 上已删除的文件
  • 使用 Nacos 来管理微服务
  • 《软件架构基础》读书笔记
  • 【SQL】常见语句合集
  • 何时使用枚举处理前后端的数据传输
  • 深度学习(十一)-PaddlePaddle
  • Java语言程序设计基础篇_编程练习题**17.20 (二进制编辑器)
  • 手撕HashMap源码