++设计模式是在已有的方案之上发现更好的方案,而不是全新发明,不要为了强迫自己使用已有的设计模式而限制了你的创造力++
创建型模式
处理对象创建相关问题
1 工厂模式
1.1 工厂方法
==一个函数==,对不同的输入参数返回不同的对象
- 集中在一个地方创建对象,方便对对象的追踪
- 解耦创建对象-使用对象
- 在必要时才创建新对象,提高性能和内存使用率
1.2 抽象工厂
同属于==单个类==的许多工厂方法用于创建==一系列==种类的相关对象,每个工厂方法负责生产不同种类的对象
2 建造者模式
- 想要创建一个由多个部分构成的对象,而且它的构成需要一步接一步完成,只有每个部分都创建好,这个对象才是完整的。
- 当这个构造过程可以产生不同的表现,就可以试用建造者模式。
- 与工厂模式的区别:工厂模式以单个步骤创建对象,建造者模式以多个步骤创建对象;工厂模式会立刻返回一个创建好的对象,建造者模式仅在需要时才显示地请求指挥者返回最终的对象。
与工厂模式相比,以下情况建造者模式更好:
- 创建一个复杂对象(对象由多个部分构成,且对象的创建要经过多个不同的步骤,这些步骤也许还要遵从特定的顺序)
- 要求一个对象能有不同的表现,且对象的构建与表现解耦
- 想要在某个时间点创建对象,但是在稍后的时间点再访问
3 原型模式
用于创建对象的完全副本
- copy.copy() 创建浅副本,副本依赖引用
- copy.deepcopy() 创建深副本,副本复制所有东西,此时需要关注因对象克隆而引入的资源耗用问题。
机构型模式
4 适配器模式
- 处理一个系统中的不同实体之间的关系,关注的是提供一种简单的对象组合来创造新功能。
- 比如:使用该模式让多个接口兼容。
5 修饰器模式
- 与继承相比,通常应该优选组合,因为继承会使代码更难复用。
- python装饰器比修饰器模式能做的更多,其中之一就是实现修饰器模式。
- 比如:使用装饰器来扩展一个对象的行为
6 外观模式
- 有助于隐藏系统内部的复杂性,并通过一个简易的接口向客户端暴露必要的部分。
- 外观封装内部系统
7 享元模式
- 通常为相似对象引入数据共享来最小化内存使用,提示性能。
- 旨在优化性能和内存使用。
- 关注的是共享对象数据
- 一般来说,在应用需要创建大量的计算代价但共享许多属性的对象时,可以使用享元模式,重点在于将不可变(可共享)的属性与可变的属性区别开
8 模型-视图-控制器模式 MVC模式
关注点分离 SoC Separation of Concerns 原则
- 中心思想是:将一个应用切分成不同的部分,每个部分解决一个单独的关注点
- 分层设计中的层次(数据访问层,业务逻辑层,表示层等)即是关注点
模型、视图、控制器
- 模型负责访问数据,管理应用的状态
- 视图是模型的外在表现,视图并非必须是图形化的,文本输出也可以
- 控制器是模型与视图之间的连接
9 代理模式
在访问某个对象之前执行一个或多个重要的操作,比如ORM是关系型数据库的代理
四种代理模式如下:
- 远程代理:代表一个活跃于远程位置(例如远程服务器或云服务)的对象
- 虚拟代理:讲一个对象的初始化延迟到真正需要时使用
- 保护/防护代理:用于对处理敏感信息的对象进行访问控制
- 智能/引用代理:通过添加帮助信息(比如引用计数)来扩展一个对象的行为
行为模式
10 责任链模式
- 责任链模式用于让多个对象来处理单个请求时,或者用于预先不知道应该由哪个对象来处理某个特性请求时。
- 发送方可以直接访问链中的首个节点。若首个节点不能处理请求,则转发给下一个节点,直到请求被某个节点处理或者整个链遍历结束
- 可以实现发送发与多个接收方之间的解耦
原则:
- 存在一个对象链(链表,树或者任何其他便捷的数据结构)
- 一开始将请求发送给链中的第一个对象
- 对象决定其是否处理该请求
- 对象将请求转发给下一个对象
- 重复该过程,指导达到链尾
11 命令模式
- 将一个操作封装成一个对象
- 调用命令的对象与执行命令的对象解耦