python设计模式-工厂模式

工厂模式的核心思想:封装对象创建过程、解耦对象使用与创建 。

示例代码:

python 复制代码
from enum import Enum


# 基类:人类
class Person:
    species = 'Homo sapiens'

    def __init__(self, name):
        self.name = name

    def __str__(self):
        return f"{self.__class__.__name__}: {self.name}"


# 子类:成年人
class Adult(Person):
    def can_vote(self):
        return True  # 成年人有投票权


# 子类:未成年人
class Minor(Person):
    def can_vote(self):
        return False  # 未成年人无投票权


# 子类:匿名人士
class AnonymousPerson(Person):
    def __init__(self):
        super().__init__('Anonymous')  # 固定名称为Anonymous


# 枚举:定义支持的人物类型
class PersonType(Enum):
    ADULT = 1
    MINOR = 2
    ANONYMOUS = 3


# 工厂类:负责创建不同类型的Person对象
class PersonFactory:
    @staticmethod
    def create_person(person_type, name=None):
        """
        根据类型创建不同的Person对象
        :param person_type: PersonType枚举值,指定要创建的对象类型
        :param name: 名称(匿名类型不需要此参数)
        :return: 对应的Person子类实例
        """
        if person_type == PersonType.ADULT:
            if not name:
                raise ValueError("创建成年人需要提供姓名")
            return Adult(name)
        elif person_type == PersonType.MINOR:
            if not name:
                raise ValueError("创建未成年人需要提供姓名")
            return Minor(name)
        elif person_type == PersonType.ANONYMOUS:
            return AnonymousPerson()  # 匿名类型无需姓名
        else:
            raise ValueError(f"不支持的人物类型: {person_type}")


# 使用示例
if __name__ == "__main__":
    # 通过工厂创建不同类型的对象
    adult = PersonFactory.create_person(PersonType.ADULT, "Alice")
    minor = PersonFactory.create_person(PersonType.MINOR, "Bob")
    anonymous = PersonFactory.create_person(PersonType.ANONYMOUS)

    print(adult)  # 输出:Adult: Alice
    print(minor)  # 输出:Minor: Bob
    print(anonymous)  # 输出:AnonymousPerson: Anonymous

    print(adult.can_vote())  # 输出:True
    print(minor.can_vote())  # 输出:False

以上代码通过创建独立的工厂类,并通过工厂类来管理不同类型对象的创建。

这个实现的特点(符合标准工厂模式):

  1. 分离的工厂类

    创建了独立的PersonFactory类,专门负责对象的创建逻辑,而Person及其子类只关注自身的业务逻辑(如can_vote方法)。这种分离符合 "单一职责原则"。

  2. 通过类型控制创建

    使用PersonType枚举明确支持的对象类型,调用者只需指定类型和必要参数(如姓名),无需直接实例化具体子类(如Adult()Minor())。

  3. 封装创建细节

    工厂类内部处理了不同类型对象的创建条件(如匿名对象不需要姓名),调用者无需关心这些细节,只需通过统一的create_person方法获取对象。

  4. 易于扩展

    如果需要新增Person类型(如Senior老年人),只需:

    • 创建Senior子类继承Person
    • PersonType枚举中添加SENIOR
    • 在工厂类的create_person方法中增加对应分支
      无需修改现有业务逻辑,符合 "开闭原则"。
  5. 统一的接口

    所有通过工厂创建的对象都遵循Person基类的接口规范(如都有name属性和__str__方法),调用者可以统一处理这些对象,无需区分具体类型。

这种实现比之前的类方法方式更接近标准工厂模式,尤其在需要管理多种对象类型、创建逻辑复杂的场景下,优势会更加明显。

相关推荐
djarmy3 小时前
MAIN.c(1): warning C318: can’t open file ‘STC8G.H’ 报错 解决 分析
c语言·开发语言·mongodb
广州山泉婚姻3 小时前
Python序列号源码分析
python
HEJOO93 小时前
深入理解 Java volatile 关键字:原理、用法与常见误区
java·开发语言·spring
曹牧3 小时前
Java:no content to map due to end of input
java·开发语言
计算机源码社4 小时前
【大数据项目实战】基于大数据的影视内容生态综合质量分析与可视化-基于数据挖掘的影视内容类型共现与口碑聚类分析系统
大数据·人工智能·python·数据挖掘·数据分析·毕业设计·课程设计
梦梦代码精4 小时前
《回收租赁系统技术选型避坑指南:业务闭环与二开自由度详解》
开发语言·低代码·docker·开源·代码规范
C^h4 小时前
pytorch 适合初学者 0基础学习
人工智能·pytorch·python
隔窗听雨眠4 小时前
记一次SQL Server数据库性能分析:从CPU100%到单配置修复的完整诊断
开发语言·数据库·php
David猪大卫4 小时前
【C++修炼】智能指针使用及原理
开发语言·c++·经验分享·笔记·学习·考研·面试
charlie1145141914 小时前
现代Qt开发之图像处理进阶:像素操作与格式转换
开发语言·图像处理·qt