后端设计模式介绍

GoF 将设计模式分为三大类,共 23 种设计模式

一、创建型模式(Creational Patterns)

创建型模式关注对象的创建过程,旨在通过封装对象的实例化过程来使系统独立于对象的具体实现。

1. 单例模式(Singleton Pattern)

  • 保证一个类仅有一个实例,并提供一个全局访问点。

  • 适用场景:工具类、配置类、线程池等。

  • Golang实现例子

2. 工厂方法模式(Factory Method Pattern)

  • 定义一个用于创建对象的接口,但允许子类决定实例化哪一个类。

  • 适用场景:需要创建一组具有共同父类的对象。

  • Golang实现例子

3. 抽象工厂模式(Abstract Factory Pattern)

  • 提供一个创建一系列相关或互相依赖对象的接口。

  • 适用场景:需要创建多个相关类的对象,但不希望指定具体类。

  • Golang实现例子

4. 建造者模式(Builder Pattern)

  • 将一个复杂对象的构建与其表示分离,以便相同的构建过程可创建不同的表示。

  • 适用场景:像构建多步骤的复杂对象(如配置对象、SQL 查询等)。

  • Golang实现例子

5. 原型模式(Prototype Pattern)

  • 使用原型实例指定创建对象的种类,并通过拷贝这些原型来创建新的对象。

  • 适用场景:需要大量重复类似的对象时(如克隆、深拷贝)。

  • Golang实现例子

二、结构型模式(Structural Patterns)

结构型模式关注类或对象的组合,以便更好地实现功能。

6. 适配器模式(Adapter Pattern)

  • 将一个类的接口转换成客户期望的另一个接口,使接口不兼容的类能够一起工作。

  • 适用场景:旧的类需要适配新接口。

  • Golang实现例子

7. 桥接模式(Bridge Pattern)

  • 将抽象部分与其具体实现分离,使它们可以独立地变化。

  • 适用场景:跨多个维度维度变化(如不同设备的 UI 与驱动)。

  • Golang实现例子

8. 装饰器模式(Decorator Pattern)

  • 动态地为对象添加额外的职责。

  • 适用场景:扩展类的功能且不使用继承。

  • Golang实现例子

9. 组合模式(Composite Pattern)

  • 将对象组合成树状结构以表示“整体-部分”的层次结构。

  • 适用场景:需要表示对象的层次结构(如文件系统)。

  • Golang实现例子

10. 外观模式(Facade Pattern)

  • 为子系统中的一组接口提供一个统一的接口。

  • 适用场景:简化复杂系统调用提供的接口。

  • Golang实现例子

11. 享元模式(Flyweight Pattern)

  • 运用共享技术有效地支持大量细粒度对象。

  • 适用场景:大量相似对象(如对象池、缓存)。

  • Golang实现例子

12. 代理模式(Proxy Pattern)

  • 为其他对象提供一个代理以控制对该对象的访问。

  • 适用场景:远程代理、安全代理、缓存代理等。

  • Golang实现例子

三、行为型模式(Behavioral Patterns)

行为型模式关注对象如何交互以及职责划分,通过类之间的通信分担责任。

13. 职责链模式(Chain of Responsibility Pattern)

  • 将能够处理请求的多个对象连成一条链,沿着链传递请求,直到被某个对象处理。

  • 适用场景:多个处理器对请求的依赖关系(如审批流)。

  • Golang实现例子

14. 命令模式(Command Pattern)

  • 将请求封装为对象,使可以通过参数化不同的请求来对请求排队或记录日志。

  • 适用场景:任务队列、请求撤销等。

  • Golang实现例子

15. 解释器模式(Interpreter Pattern)

  • 给定一种语言,定义一种表示该语言的文法和解释器。

  • 适用场景:实现简单语法规则的场景(如正则表达式解析)。

  • Golang实现例子

16. 迭代器模式(Iterator Pattern)

  • 提供一种顺序访问集合对象的元素的方法,而不暴露其内部结构。

  • 适用场景:遍历集合时使用。

  • Golang实现例子

17. 中介者模式(Mediator Pattern)

  • 用一个中介对象封装一组对象的交互。

  • 适用场景:多个对象之间相互交互过于复杂时(如聊天室系统)。

  • Golang实现例子

18. 备忘录模式(Memento Pattern)

  • 在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存状态。

  • 适用场景:需要保存/回退对象状态时(如撤销功能)。

  • Golang实现例子

19. 观察者模式(Observer Pattern)

  • 定义对象间一种一对多的依赖,一个对象改变状态时会通知所有依赖者。

  • 适用场景:事件驱动编程(如订阅-通知模型)。

  • Golang实现例子

20. 状态模式(State Pattern)

  • 允许对象在内部状态变化时改变其行为。

  • 适用场景:有限状态机设计(如订单状态流转)。

  • Golang实现例子

21. 策略模式(Strategy Pattern)

  • 定义一系列算法,并使它们可以互换。

  • 适用场景:可动态选择算法。

  • Golang实现例子

22. 模板方法模式(Template Method Pattern)

  • 定义算法框架,将某些步骤延迟到子类实现。

  • 适用场景:抽象出公共操作,再将具体实现交由子类。

  • Golang实现例子

23. 访问者模式(Visitor Pattern)

  • 表示一个作用于某对象的数据操作,使你可以在不改变类的前提下定义作用于这些对象的操作。

  • 适用场景:需要对多个类的结构进行操作(如对象树的遍历操作)。

  • Golang实现例子

四、总结 - 设计模式分类

image-zjpd.png

类型

模式名称

创建型模式

单例、工厂方法、抽象工厂、建造者、原型

结构型模式

适配器、桥接、装饰器、组合、外观、享元、代理

行为型模式

职责链、命令、解释器、迭代器、中介者、备忘录、观察者、状态、策略、模板方法、访问者

以上是经典的 23 种 GoF 设计模式,它们广泛应用于软件开发中,帮助开发者在解决复杂问题时能够找到更灵活、可扩展和易维护的解决方案。 此外,随着技术的发展,还有新的设计模式(如微服务模式、CQRS 等)在特定技术领域被广泛应用。设计模式的核心思想始终是为复杂问题提供优雅的解决方案,辅助程序员简化代码复杂度和增强系统可扩展性!