11.Python设计模式:单例模式与工厂模式实战指南

一、单例模式(Singleton Pattern)

1.1 核心定义

确保一个类仅有一个实例存在,并提供全局访问点。适用于需要严格控制实例数量的场景。

1.2 多种实现方式

方式1:模块级单例(推荐)

python 复制代码
# singleton.py
class _Singleton:
    def __init__(self):
        self.config = {}
    
instance = _Singleton()

# 使用
from singleton import instance
instance.config["debug"] = True

方式2:装饰器实现

python 复制代码
def singleton(cls):
    instances = {}
    
    def get_instance(*args, **kwargs):
        if cls not in instances:
            instances[cls] = cls(*args, **kwargs)
        return instances[cls]
    
    return get_instance

@singleton
class DatabaseConnection:
    def __init__(self):
        self.connection = create_connection()

方式3:元类实现(线程安全版)

python 复制代码
import threading

class SingletonMeta(type):
    _instances = {}
    _lock = threading.Lock()

    def __call__(cls, *args, **kwargs):
        with cls._lock:
            if cls not in cls._instances:
                instance = super().__call__(*args, **kwargs)
                cls._instances[cls] = instance
            return cls._instances[cls]

class Logger(metaclass=SingletonMeta):
    def __init__(self):
        self.logs = []

1.3 优缺点分析

优点

  • 资源高效利用(如数据库连接池)
  • 全局状态统一管理
  • 避免重复初始化开销

缺点

  • 违反单一职责原则
  • 单元测试困难(全局状态污染)
  • 多线程需额外处理同步问题

1.4 典型应用场景

  • 配置管理(Django settings)
  • 日志记录系统
  • 硬件接口访问(如打印机控制)
  • 缓存系统(Redis连接池)

二、工厂模式(Factory Pattern)

2.1 模式分类

类型 特点 适用场景
简单工厂 一个工厂类创建所有产品 产品类型较少
工厂方法 每个产品对应专属工厂 需要扩展新产品
抽象工厂 创建产品族 系统需要多套组件

2.2 工厂方法模式实现

python 复制代码
from abc import ABC, abstractmethod

class PaymentMethod(ABC):
    @abstractmethod
    def pay(self, amount):
        pass

class Alipay(PaymentMethod):
    def pay(self, amount):
        print(f"支付宝支付{amount}元")

class WechatPay(PaymentMethod):
    def pay(self, amount):
        print(f"微信支付{amount}元")

class PaymentFactory(ABC):
    @abstractmethod
    def create_payment(self):
        pass

class AlipayFactory(PaymentFactory):
    def create_payment(self):
        return Alipay()

class WechatFactory(PaymentFactory):
    def create_payment(self):
        return WechatPay()

# 使用
factory = AlipayFactory()
payment = factory.create_payment()
payment.pay(100)  # 支付宝支付100元

2.3 抽象工厂模式实战

python 复制代码
class GUIFactory(ABC):
    @abstractmethod
    def create_button(self):
        pass
    
    @abstractmethod
    def create_menu(self):
        pass

class WindowsFactory(GUIFactory):
    def create_button(self):
        return WindowsButton()
    
    def create_menu(self):
        return WindowsMenu()

class MacFactory(GUIFactory):
    def create_button(self):
        return MacButton()
    
    def create_menu(self):
        return MacMenu()

# 根据系统环境选择工厂
def get_factory(os_type):
    factories = {
        "windows": WindowsFactory,
        "mac": MacFactory
    }
    return factories[os_type]()

2.4 模式优缺点

优点

  • 解耦对象创建与使用
  • 符合开闭原则(扩展新类型不影响已有代码)
  • 统一产品创建接口

缺点

  • 增加代码复杂度
  • 需要预先设计工厂层级结构
  • 学习曲线较陡峭

2.5 典型应用场景

  • ORM框架(Django Model字段生成)
  • 数据序列化(DRF根据格式生成不同输出)
  • 跨平台UI组件库
  • 文件格式解析器(Excel/CSV/JSON)

三、模式对比与选型指南

维度 单例模式 工厂模式
主要目的 控制实例数量 封装对象创建
使用场景 全局状态管理 多态对象创建
扩展性
复杂度 中高
测试难度

最佳实践建议

  1. 优先使用模块实现单例(Python天然特性)
  2. 简单场景用类装饰器,复杂场景用元类
  3. 工厂模式与依赖注入结合使用
  4. 避免单例的隐式依赖(考虑传递实例)
  5. 使用abc模块强化接口约束

四、真实框架应用案例

4.1 Django中的单例模式

python 复制代码
# django/conf/__init__.py
class LazySettings(LazyObject):
    def _setup(self, name=None):
        # 全局配置单例
        self._wrapped = Settings(settings_module)

settings = LazySettings()

4.2 DRF中的工厂模式

python 复制代码
# rest_framework/parsers.py
class JSONParser(BaseParser):
    media_type = 'application/json'

def parser_factory(media_type):
    return {
        'application/json': JSONParser,
        'text/html': HTMLParser
    }[media_type]()

# 根据请求头自动选择解析器

结语

单例模式与工厂模式作为经典设计模式,在Python生态中广泛应用。单例模式适合需要严格管控资源的场景,而工厂模式则为复杂对象创建提供优雅解决方案。实际开发中应根据业务需求灵活选择,避免过度设计,同时注意模式带来的副作用。建议结合Python语言特性(如模块系统、装饰器)实现更简洁的模式应用。```

相关推荐
深科文库4 分钟前
构建 MCP 服务器:第 4 部分 — 创建工具
python·chatgpt·prompt·aigc·agi·ai-native
袁煦丞7 分钟前
跨平台终端王者Tabby:cpolar内网穿透实验室第632个成功挑战
前端·程序员·远程工作
witton8 分钟前
美化显示LLDB调试的数据结构
数据结构·python·lldb·美化·debugger·mupdf·pretty printer
Sailing9 分钟前
Grafana-mcp-analyzer:基于 MCP 的轻量 AI 分析监控图表的运维神器!
前端·node.js·mcp
阿山同学.28 分钟前
AWS 亚马逊 S3存储桶直传 前端demo 复制即可使用
前端·javascript·aws
Jolyne_37 分钟前
grid 实现完美的水平铺满、间隔一致的自适应布局
前端·css
西洼工作室41 分钟前
【解决导航栏字体图标渲染导致文本闪烁问题】采用腾讯视频的解决方案
前端·css·css3
WindrunnerMax1 小时前
从零实现富文本编辑器#5-编辑器选区模型的状态结构表达
前端·架构·github
CodeSheep1 小时前
宇树科技,改名了!
前端·后端·程序员
nenchoumi31191 小时前
AirSim/Cosys-AirSim 游戏开发(一)XBox 手柄 Windows + python 连接与读取
windows·python·xbox