本文创建于 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. 如何拓展

  • 实现新的叶子节点类,增加新的职责
  • 修改组合节点类,调整子组件的逻辑或顺序