Python 设计模式全解析
设计模式是针对软件设计中常见问题的通用解决方案。在 Python 中,我们利用其动态特性,可以用比 Java 更简洁的代码实现这些模式。
代码直戳: https://github.com/faif/python-patterns
一、 创建型模式 (Creational Patterns)
核心目标:处理对象的创建,将系统与对象的创建、组合、表示分离。
1. 工厂方法 (Factory Method)
- 代码示例:
- 优点: 屏蔽对象创建细节,增加新产品只需扩展工厂,不改动调用方。
- 缺点: 简单场景下会增加代码结构的复杂性。
- 适用场景: 需要根据配置或环境动态决定实例化哪类对象时。
2. 抽象工厂 (Abstract Factory)
- 代码示例:
- 优点: 确保一系列相关对象能一起工作,保证风格统一。
- 缺点: 扩展“产品族”非常困难(例如增加一个蓝色主题需要修改所有工厂)。
- 适用场景: 换肤系统、多数据库驱动支持。
3. 惰性初始化 (Lazy Evaluation)
- 代码示例:
- 优点: 减少启动开销,按需分配内存。
- 缺点: 第一次调用时可能会产生明显的延迟。
- 适用场景: 加载大型文件、建立昂贵的网络连接。
4. 生成器模式 (Builder)
- 代码示例:
- 优点: 允许分步创建复杂对象,且相同的创建过程可以创建不同的表示。
- 缺点: 需要定义多个具体的生成器类。
- 适用场景: 创建具有多个可选参数的复杂对象。
5. 单例模式 (Singleton)
- 代码示例:
- 优点: 节约内存,保证全局状态唯一。
- 缺点: 违背单一职责原则,在多线程环境下需额外处理锁。
- 适用场景: 配置管理、数据库连接池。
6. 原型模式 (Prototype)
- 代码示例:
- 优点: 逃避构造函数的约束,直接克隆复杂状态的对象,效率更高。
- 缺点: 深拷贝复杂对象时容易出现循环引用问题。
- 适用场景: 游戏中的大量小怪生成、复杂的初始配置备份。
7. 对象池 (Object Pool)
- 代码示例:
- 优点: 显著提高频繁创建/销毁昂贵对象的性能。
- 缺点: 必须严格管理对象的“归还”逻辑,否则会导致池枯竭。
- 适用场景: 数据库连接、线程池、网络套接字。
二、 结构型模式 (Structural Patterns)
核心目标:关注类和对象的组合。
8. 装饰器模式 (Decorator)
- 代码示例:
- 优点: 动态扩展功能,比继承更灵活。
- 缺点: 多个嵌套装饰器会增加调试难度。
- 适用场景: 日志监控、权限校验。
9. 代理模式 (Proxy)
- 代码示例:
- 优点: 控制访问、延迟加载。
- 缺点: 在访问者与目标间增加了中间层,可能稍微影响速度。
- 适用场景: 远程代理、安全控制、智能引用。
三、 行为型模式 (Behavioral Patterns)
核心目标:关注对象间的通信。
10. 迭代器模式 (Iterator)
- 代码示例:
- 优点: 访问集合内容而不暴露内部结构,支持多种遍历方式。
- 缺点: 对于简单的集合,手动实现迭代器显得多余。
- 适用场景: 遍历数据库记录、处理大型流式文件。

