Skip to content

11 design patterns reference

omeyang edited this page Sep 16, 2026 · 1 revision

设计模式参考

本文档是设计模式参考清单,供开发中遇到问题时查阅。

使用原则:仅供参考,不强制使用任何模式,根据实际场景灵活选择。

核心理念:优先使用简单方案,只在必要时考虑模式。


使用指南

何时参考此文档

  • 遇到重复代码、复杂依赖、扩展性问题时
  • 需要提高代码可维护性时
  • 团队协作需要统一解决方案时

不应该做的

  • 预先定义所有模式
  • 为了使用模式而强行套用
  • 过度设计和过度抽象
  • 脱离实际场景的理论实现

模式分类索引

可靠性模式

模式 用途 适用场景
断路器 (Circuit Breaker) 防止级联故障 外部服务调用、数据库连接池
重试 (Retry) 处理临时故障 网络抖动、临时性错误
隔层 (Bulkhead) 资源隔离 协程池隔离、连接池隔离
限流 (Throttling) 流量控制 API 限流、资源保护
超时 (Timeout) 防止资源长时间占用 所有外部调用
健康检查 (Health Endpoint Monitoring) 服务健康监控 微服务健康探测

性能优化模式

模式 用途 适用场景
缓存端 (Cache-Aside) 旁路缓存 热点数据缓存、配置缓存
预加载 (Preload) 数据预加载 启动时加载全量数据到内存
CQRS 读写分离 读多写少的场景
事件溯源 (Event Sourcing) 事件驱动 状态变更追踪、审计日志
异步处理 (Async Request-Reply) 耗时任务异步化 批量导入、数据处理
队列削峰 (Queue-Based Load Leveling) 流量削峰 消息队列缓冲
对象池 (Object Pool) 对象复用 连接池、协程池

创建型模式

模式 用途 适用场景
工厂方法 (Factory Method) 对象创建 创建不同类型的对象
抽象工厂 (Abstract Factory) 创建对象家族 多环境配置创建
生成器 (Builder) 复杂对象构建 多参数对象、查询条件
单例 (Singleton) 全局唯一实例 配置管理、连接池
原型 (Prototype) 对象克隆 配置模板复制

结构型模式

模式 用途 适用场景
适配器 (Adapter) 接口适配 统一不同库的接口
桥接 (Bridge) 抽象与实现分离 多种数据库实现
组合 (Composite) 树形结构 组织层级、分组结构
装饰 (Decorator) 动态扩展功能 中间件、插件
外观 (Facade) 统一接口 复杂子系统封装
享元 (Flyweight) 对象共享 内存优化
代理 (Proxy) 访问控制 缓存代理、权限控制

行为型模式

模式 用途 适用场景
责任链 (Chain of Responsibility) 请求链式处理 验证链、匹配规则链
命令 (Command) 请求封装 操作记录、撤销重做
中介者 (Mediator) 对象交互中介 事件总线、消息分发
观察者 (Observer) 状态变化通知 事件通知、数据变更
状态 (State) 状态变化行为 状态机、工作流
策略 (Strategy) 算法替换 多种算法选择
模板方法 (Template Method) 算法骨架 流程模板、公共步骤

安全模式

模式 用途 适用场景
网关卸载 (Gateway Offloading) 统一认证/限流 API Gateway
防损层 (Anti-Corruption Layer) 隔离遗留系统 旧系统适配

运营模式

模式 用途 适用场景
外部配置存储 (External Configuration Store) 配置中心 动态配置、多环境配置
挎斗 (Sidecar) 边车模式 日志收集、监控代理
Strangler Fig 增量迁移 旧系统逐步替换
蓝绿部署 (Blue-Green) 无缝部署 零停机部署
金丝雀发布 (Canary) 灰度发布 风险控制

Go 实现库推荐

可靠性

库名 模式 用途
github.com/sony/gobreaker 断路器 防止级联故障
github.com/cenkalti/backoff 重试 指数退避重试
golang.org/x/time/rate 限流 令牌桶限流器
go.uber.org/ratelimit 限流 漏桶限流器

性能

库名 模式 用途
github.com/dgraph-io/ristretto/v2 缓存 高性能本地缓存
github.com/redis/go-redis/v9 缓存 Redis 客户端
github.com/panjf2000/ants/v2 对象池 Goroutine 池
sync.Pool(标准库) 对象池 对象复用

消息队列

库名 模式 用途
github.com/apache/pulsar-client-go 事件溯源 Pulsar 客户端
github.com/confluentinc/confluent-kafka-go/v2 事件溯源 Kafka 客户端
github.com/hibiken/asynq 异步处理 异步任务队列

模式选择流程

遇到问题
    |
是否有简单方案? ---------> 是 --> 直接实现
    | 否
问题是否重复出现? -------> 否 --> 直接实现
    | 是
查阅模式参考手册
    |
是否有合适的模式? -------> 否 --> 自定义方案
    | 是
评估成本收益
    |
收益 > 成本? ------------> 否 --> 简化方案
    | 是
应用模式 + 文档记录

参考资源

Clone this wiki locally