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

Python高级应用系列(九):设计模式在Python中的实现——从原理到代码

标签:Python | 设计模式 | SOLID原则 | 面向对象 | 软件架构
字数:约 4500 字
建议阅读时间:14 分钟


前言

设计模式是软件工程的经典沉淀,最早由 GoF(Gang of Four)在《设计模式》一书中系统提出。然而,很多 Python 开发者认为"设计模式是 Java 的东西",这是一个误解。Python 的动态特性、 duck typing 和一等函数让很多传统模式得以简化,同时也催生了一些 Python 特有的模式。

本文选取 10 个在 Python 中最常用、最有价值的设计模式,用代码讲解其实现方式和适用场景。


一、单例模式:全局唯一实例

1.1 模块级单例(最 Pythonic)

Python 模块天然是单例——导入一次后全局缓存:

# config.py class Config: def __init__(self): self.debug = True self.host = "localhost" config = Config() # 模块加载时创建,全局唯一

使用时直接import config,同一进程内任何地方引用都是同一个实例。

1.2 装饰器单例

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 Database: def __init__(self, url): self.url = url db1 = Database("mysql://localhost") db2 = Database("mysql://remote") print(db1 is db2) # True —— db2 被忽略,返回同一个实例

1.3 元类单例

class SingletonMeta(type): _instances = {} def __call__(cls, *args, **kwargs): if cls not in cls._instances: cls._instances[cls] = super().__call__(*args, **kwargs) return cls._instances[cls] class AppConfig(metaclass=SingletonMeta): def __init__(self): self.version = "1.0.0" config1 = AppConfig() config2 = AppConfig() print(config1 is config2) # True

二、工厂模式:对象创建的封装

2.1 简单工厂

class Dog: def speak(self): return "汪汪!" class Cat: def speak(self): return "喵~" class Bird: def speak(self): return "啾啾!" def animal_factory(kind: str): """简单工厂:根据字符串创建对象""" mapping = {"dog": Dog, "cat": Cat, "bird": Bird} cls = mapping.get(kind) if not cls: raise ValueError(f"不支持的动物类型: {kind}") return cls() print(animal_factory("dog").speak()) # 汪汪!

2.2 工厂方法模式

父类定义抽象方法,子类决定具体实现:

from abc import ABC, abstractmethod class Animal(ABC): @abstractmethod def speak(self): pass def move(self): return f"{self.__class__.__name__} 在移动" class LandAnimal(Animal): def speak(self): return "陆地动物叫声" class WaterAnimal(Animal): def speak(self): return "水中动物叫声" class AnimalFactory(ABC): @abstractmethod def create(self) -> Animal:
http://www.cnnetsun.cn/news/1980677.html

相关文章:

  • 文档自动化:从代码注释生成API文档的系统
  • STM32CubeMX新手必看:5分钟搞定LED闪烁工程(Keil环境)
  • Oracle 19c升级实战:EXPDP迁移中的六大“坑”与填坑指南
  • 用LM358做个USB供电的电平指示器:从仿真到PCB打样的保姆级教程
  • 终极指南:如何用ncmdump轻松解密网易云音乐NCM格式文件
  • Sunshine游戏串流终极指南:从入门到专家的完整配置与优化方案
  • 5分钟学会B站M4S转MP4:快速免费的视频格式转换终极方案
  • 目标检测精度上不去?试试YOLOv4/PP-YOLOE都在用的CSPNet Backbone配置实战
  • GNU Radio gr-digital 避坑指南:从OFDM同步到Packet解析,新手常踩的5个雷区
  • Windows 11资源管理器崩溃终结者:ExplorerPatcher深度修复指南
  • 前端架构设计思路解析
  • 卡梅德生物技术快报|【生物材料】荧光纳米材料在蛋白质标记与检测中的技术实现与应用分析
  • 解锁多平台SDR频谱分析:QSpectrumAnalyzer深度指南
  • 相变材料属性分段函数(示意)
  • Mitigating Estimation Bias in Actor-Critic Algorithms: From Theory to TD3
  • 【2026奇点大会独家前瞻】:AGI原生产品设计的5大范式转移与3个已验证落地模型
  • 从伯德图到Simulink仿真:基于MATLAB的汽车悬挂减震控制建模与性能分析
  • 保姆级教程:用JavaCV+ZLMediaKit搞定大华/海康摄像头实时流(附完整代码)
  • 别再死记硬背状态机了!用Verilog HDL在FPGA上实现一个可复用的移位寄存器(附完整代码)
  • 手把手带你用8086的寄存器,写一段简单的汇编代码(附调试技巧)
  • 别再混淆了!用C#的async/await写UI程序,为什么感觉不到多线程?
  • 基于springboot的汽车美容保养管理系统
  • 从8b/10b到64b/66b:深入JESD204C链路层,看高速SerDes协议如何演进
  • 198.打家劫舍
  • STM32F407驱动WS2812灯带,用CubeIDE配置DMA+TIM3_PWM的保姆级避坑指南
  • 智能风控中的反欺诈模型与实时决策引擎
  • 物联网(IoT)入门:ESP32连接阿里云平台实战
  • Markdown Viewer:免费浏览器扩展终极指南,高效渲染本地与远程Markdown文件
  • Windows 11下,用Rust给Qt 5.14.2写GUI:从环境配置到第一个窗口(避坑VS2022命令提示符)
  • OpCore Simplify:黑苹果配置终极指南 - 一键自动化OpenCore EFI创建