设计模式-P2
本文创建于
2024-11-30
;修改于2024-12-1
;
单例模式
1. 定义
保证一个类仅有一个实例,并提供一个该实例的全局访问点。
2. 解决的问题
- 稳定点:类只有一个实例,并提供全局访问点
- 变化点:有多个类都是单例,能不能复用代码
3. 代码结构
私有的构造和析构函数
禁止拷贝构造、拷贝赋值、移动构造、移动赋值
静态类成员函数
静态私有成员变量
4. 符合哪些设计原则
单一职责原则:类只有一个职责,即管理自己的唯一实例
开放封闭原则:通过静态成员函数获取实例,不修改类的外部接口
依赖倒置原则:依赖于抽象而不是具体实现
5. 如何拓展
- 多线程环境下的线程安全实现
- 通过配置文件或参数动态决定单例类的具体实现
工厂模式
1. 定义
定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使得一个类的实例化延迟到子类。
2. 解决的问题
- 稳定点:创建同类对象的接口;同类对象有一个相同的职责
- 变化点:创建对象的拓展
3. 代码结构
对象创建接口
- 根据功能创建具体对象
- 调用功能结构
单个功能接口
4. 符合哪些设计原则
最小知道原则:工厂类只负责创建对象,不关心对象的具体实现
面向接口编程:通过接口定义对象的创建和使用
依赖倒置原则:依赖于抽象而不是具体实现
5. 如何拓展
- 实现对象创建接口
- 实现功能接口
- 多态调用
抽象工厂
1. 定义
提供一个接口,让该接口负责创建一系列“相关或者相互依赖的对象”,无需指定它们具体的类。
2. 解决的问题
- 稳定点:创建同类对象的接口;同类对象有多个相同的职责;
- 变化点:创建对象的拓展
3. 代码结构
对象创建接口
- 根据功能创建具体对象
- 提供多个功能接口
多个功能接口
4. 符合哪些设计原则
单一职责原则:每个工厂只负责创建一组相关的对象
开放封闭原则:通过扩展工厂类来支持新的对象类型
依赖倒置原则:依赖于抽象而不是具体实现
5. 如何拓展
- 实现对象创建接口
- 实现功能接口
- 多态调用
责任链
1. 定义
使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递请求,直到有一个对象处理它为止。
2. 解决的问题
- 稳定点:处理流程,请求按照链条传递;处理流程可以被打断;
- 变化点:处理节点的个数、处理顺序以及处理条件;
3. 代码结构
从单个节点出发,实现处理接口,实现一个构建链表关系的静态接口;
4. 符合哪些设计原则
组合优于继承
面向接口编程
接口依赖
5. 如何拓展
- 实现处理接口;
- 修改静态接口;
装饰器
1. 定义
动态地给一个对象增加一些额外的职责,就增加功能而言,装饰器模式比生产子类更为灵活。
2. 解决的问题
- 稳定点:顺序无关的增加职责
- 变化点:职责拓展
3. 代码结构
定义一个抽象组件接口
定义一个具体组件实现抽象组件接口
定义一个装饰器类,继承抽象组件接口,并包含一个抽象组件的引用
定义具体装饰器类,继承装饰器类,并在其中添加额外的职责
4. 符合哪些设计原则
组合优于继承
面向接口编程
接口依赖
5. 如何拓展
-
实现新的装饰器类,增加新的职责
-
修改现有装饰器类,调整职责的顺序或逻辑
组合模式
1. 定义
将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。
2. 解决的问题
- 稳定点:层次关系稳定;对象和组合对象;
- 变化点:对象的职责变更;组合对象里对象数量的变更;
3. 代码结构
定义一个抽象组件接口
定义一个叶子节点类,实现抽象组件接口
定义一个组合节点类,实现抽象组件接口,并包含一个子组件的集合
4. 符合哪些设计原则
单一职责原则:每个类只负责自己的职责
开放封闭原则:通过扩展组合节点来支持新的子组件
依赖倒置原则:依赖于抽象的组件接口而不是具体实现
5. 如何拓展
- 实现新的叶子节点类,增加新的职责
- 修改组合节点类,调整子组件的逻辑或顺序