python-patterns:Python 设计模式集合,42k+ Star
文章目录
- python-patterns:Python 设计模式集合,42k+ Star
python-patterns:Python 设计模式集合,42k+ Star
GitHub 上有一个仓库,把常见的设计模式用 Python 重新实现了一遍,收获了 42k+ 的 Star。
这个仓库叫 python-patterns,由开发者 faif 维护,收录了创建型、结构型、行为型等多种设计模式的 Python 实现。
每个模式都是独立的 Python 文件,可以直接运行和学习。
创建型模式
创建型模式关注的是对象的创建方式。仓库中收录了以下几种:
- abstract_factory:用通用函数配合具体工厂来创建对象
- borg:一种共享状态的单例模式,所有实例共享同一个字典
- builder:通过构建对象逐步接收参数,最终返回构造好的对象
- factory:将实例创建委托给专门的函数或方法
- lazy_evaluation:Python 中的惰性求值属性模式
- pool:预先实例化并维护一组相同类型的对象
- prototype:使用工厂和原型克隆来创建新实例,适合实例化成本较高的场景
结构型模式
结构型模式定义了类和对象如何组合成更大的结构:
- adapter:通过白名单将一个接口适配到另一个接口
- bridge:在客户端和提供者之间充当中间人,降低接口变更的影响
- composite:让客户端可以统一处理单个对象和组合对象
- decorator:用其他功能包装功能,从而影响输出
- facade:用一个类作为一组其他类的 API
- flyweight:透明地复用具有相似或相同状态的现有实例
- proxy:一个对象将操作转发给另一个对象
- mvc:模型、视图、控制器的非严格关系模式
行为型模式
行为型模式关注对象之间的通信和职责分配:
- chain_of_responsibility:用一连串处理器依次尝试处理数据
- command:将命令和参数打包,稍后调用
- iterator:遍历容器并访问其元素
- mediator:一个对象知道如何连接其他对象并充当代理
- memento:生成不透明令牌,用于回退到之前的状态
- observer:为事件或数据变化提供回调通知
- publish_subscribe:源将事件或数据分发给零个或多个注册的监听者
- state:将逻辑组织为离散的潜在状态,以及可转换的下一状态
- strategy:对同一数据的可选操作
- template:对象强加一个结构,但接受可插拔的组件
- visitor:对集合中的所有项调用回调
反模式
仓库还列出了一些在 Python 中不推荐使用的设计模式:
Singleton:Python 模块本身就是单例,每个模块只会被导入一次。显式的单例类增加了不必要的复杂度,更好的做法是使用模块级变量或依赖注入。
God Object:把太多逻辑集中在一个类里,会让代码难以测试和维护。应该把功能拆分成更小、更内聚的类。
继承过度使用:深层继承树会让代码变得脆弱。Python 社区更倾向于组合优于继承。
依赖注入和委托模式
仓库还包含了依赖注入的三种变体实现,以及委托模式的实现。委托模式中,一个对象通过委托给第二个对象来处理请求。
其他模式
除了经典的 GoF 模式,仓库还收录了一些非标准模式:
- blackboard:一种架构模型,通过整合不同子系统的知识来构建解决方案
- graph_search:图搜索算法的实现
- hsm:层次状态机的实现
安装使用
克隆仓库后可以直接查看每个模式的源码:
git clone https://github.com/faif/python-patterns每个模式文件都包含模块级的 docstring,部分文件还提供了 Python 生态中的实际应用示例。
仓库还附带了视频资源,包括 Peter Ullrich 的 Python 设计模式演讲,以及 Sebastian Buczynski 关于为什么在 Python 中不需要设计模式的讨论。
对于想要深入理解设计模式在 Python 中如何落地的开发者来说,这个仓库是一个不错的参考。每个模式都有独立的实现文件,可以单独阅读和运行,不需要依赖整个项目。
的讨论。
对于想要深入理解设计模式在 Python 中如何落地的开发者来说,这个仓库是一个不错的参考。每个模式都有独立的实现文件,可以单独阅读和运行,不需要依赖整个项目。
