当前位置: 首页 > 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.jsqmd.com/news/666847/

相关文章:

  • Joplin同步冲突终极指南:多设备笔记同步冲突高效解决方案
  • 告别环境配置噩梦:保姆级教程,用ESP-IDF离线安装器5分钟搞定ESP32开发环境
  • 淘金币自动化脚本:每天5分钟,轻松完成淘宝全任务,节省20分钟宝贵时间
  • 准干式深孔加工排屑装置(论文+CAD图纸)
  • 4个高效配置技巧:如何快速上手p5.js-web-editor项目开发
  • 别再傻傻分不清!从U盘到BIOS,一文搞懂ROM、RAM、Cache和Flash Memory到底怎么用
  • ARMA模型平稳性和可逆性检查指南:避开时间序列建模的第一个大坑
  • 添加剂设计要避开化武原料?
  • 告别样本失衡!用PyTorch手把手实现RetinaNet的Focal Loss(附代码调试技巧)
  • 有成crm代理一文讲明白,销售团队的老问题,有成CRM是怎么解的? - 速递信息
  • 别再死记硬背了!用‘temper’‘tempt’‘tend’三大词根,搞定上百个英语单词(附记忆口诀)
  • C#核心概念实战演练:从选择题到编程题的思维跃迁
  • 告别复杂BADI:5分钟快速搞定SAP销售订单屏幕增强(利用SAPMV45A预留屏幕8309/8459)
  • 【技术解析】DIVFusion:如何实现无暗区红外与可见光图像融合
  • MyBatis 核心精讲:#{} 和 ${} 的区别、使用场景及原理
  • 3个核心突破:GEMMA如何重新定义基因组关联分析的工作流
  • 视频转PPT终极指南:5分钟智能提取,告别手动截图的烦恼
  • 汇川HMI: 使用符号IO域实现画面切换
  • 如何快速掌握OpenSPG知识图谱引擎:从入门到实战的完整指南
  • 高效数据迁移:艾尔登法环存档管理工具的技术实现与最佳实践
  • 别再死记硬背MOSFET工作区了!用CMOS射频开关的视角,重新理解线性区与饱和区
  • YOLO11和dlib实战:如何用Python在10分钟内搞定一个简易疲劳检测脚本?
  • AI Agent时代的职场生存:为什么你的同事被裁了,而你还在?
  • 给SoC新手的AHB总线选型指南:AMBA2 AHB2和AMBA3 AHB-Lite到底怎么选?
  • 科研人效率工具:用Zotero Scholar Citations插件一键追踪文献影响力
  • JAVA低空经济无人机飞手接单小程序源码uniapp开源代码
  • 融合物理与神经网络电池健康管理
  • Node-RED Modbus实战:从零构建工业数据采集与控制系统
  • 别再为认证头疼了!用Slack零成本搞定Outline知识库的第三方登录(Docker部署避坑实录)
  • STM32/51单片机通用:TM1638数码管按键驱动代码详解(附16键组合键处理)