python设计模式学习笔记
基于https://github.com/faif/python-patterns 的框架,查询了各个模式的资料,部分译名可能存在其他翻译
施工中,目前进度(7/38)
总述
1 创建型模式(Creational Patterns)
1.1 工厂(Factory)
工厂方法:定义一个用于创建对象的接口函数,可以控制实例化哪一个具体的类。
优点:创建对象时,调用者只需要根据定义好的接口,查询对象名即可,具体对象创建的过程由工厂完成。
缺点:有新的需要创建的对象时,需要增加具体的对象类和对应的工厂实现,维护起来比较麻烦。
1.2 抽象工厂(Abstract Factory)
如果有多个功能类似的工厂,通过抽象工厂,来创建这些工厂。
优点:抽象工厂模式除了具有工厂方法模式的优点外,最主要的优点就是可以在类的内部对产品族进行约束。
缺点:产品族的扩展将是一件十分费力的事情,假如产品族中需要增加一个新的产品,则几乎所有的工厂类都需要进行修改。所以使用抽象工厂模式时,对产品等级结构的划分是非常重要的。
1.3 原型(Prototype)
原型模式通过复制一个”原型实例”并做少量修改,来替代声明多个子类。
优点:原型模式用于创建复杂的或者耗时的实例:复制一个已经存在的实例使程序运行更高效。且对于工厂模式,原型模式减少了子类的构建。
缺点:每一个产品类都必须配置一个克隆方法,并且这个克隆方法需要对类的功能进行整体考虑。
1.4 建造者(Builder)
建造者模式适用于那些内容复杂多变,但是建造过程相同的对象。
优点: 1、建造者独立,易扩展。 2、便于控制细节风险。
缺点: 1、产品必须有共同点,范围有限制。 2、如内部变化复杂,会有很多的建造类。
1.5 孤例(Singleton)和Borg
目的:全局数据共享。传统孤立模式(Singleton) 思路为限制一个类最多存在一个实例。Borg模式通过保障同类的所有实例共享所有数据,达到了相同的目的。
1.6 对象池(Pool)
目的:对于一些创建起来颇费资源,并且一次只有一小部分被使用的对象,通过对象池可以缓存这些实例,以避免反复创建。
使用范围:一般进程池是一个典型的对象池
这部分还存在不明白的地方,但日常工作暂不涉及进程管理,暂时先不深究
1.7 (Lazy Evaluation)
目的:类的某个属性来自于一个复杂的耗时的计算,但并不是每次都会调用。通过lazy evaluation模式,可以使该值只在真正需要读取的时候才进行一次计算
2 结构型模式(Structural Patterns)
2.1 三层架构:界面层、业务逻辑层、数据访问层(3-tier)
2.2 配适器(Adapter)
2.3 桥接(Bridge)
2.4 组合(Composite)
2.5 装饰器(Decorator)
2.6 外观(Facade)
2.7 享元(Flyweight)
2.9 前段控制器(Front Controller)
2.10 代理(Proxy)
2.11 MVC(Model-View-Controller, MVC)
3 行为型模式(Behavioral Patterns)
3.1 责任链(Chain of Responsibility)
3.2 目录(Catalog)
3.3 方法链(Chainning Method)
3.4 命令(Command)
3.5 迭代器(Iterator)
3.6 中间人(Mediator)
3.7 备忘录(Memento)
3.8 观察者(Observer)
3.9 发布订阅(Publish Subscribe)
3.10 注册(Registry)
3.11 规约(Specification)
3.12 状态(State)
3.13 策略(Strategy)
3.14 模板(Template)
3.15 访问者(Visitor)
4 Design for Testability Patterns
4.1 依赖注入(Dependency Injection)
5 Fundamental Patterns
5.1 委托(Delegation Pattern)
6 Others
6.1 Blackboard
6.2 Graph Search
6.3 (Hierarchical State Machine, HSM)
参考资料
https://github.com/faif/python-patterns/readme.md
https://blog.csdn.net/u014472777/article/details/106463132
https://www.cnblogs.com/gaochundong/p/design_pattern_creational_patterns.html
原创文章,作者:,如若转载,请注明出处:https://blog.ytso.com/274332.html