# go-design-patterns **Repository Path**: jazz100bao/go-design-patterns ## Basic Information - **Project Name**: go-design-patterns - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-06-02 - **Last Updated**: 2026-06-02 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Go设计模式项目分析与实际应用场景总结 --- ## 项目概述 本项目实现了 **19种经典设计模式**,涵盖三大类别: - **创建型模式**:5种 - **结构型模式**:7种 - **行为型模式**:7种 --- ## 一、创建型设计模式 ### 1. 单例模式 (Singleton) **核心思想**:确保类只有一个实例,并提供全局访问点。 **项目实现**: - 使用 `sync.Once` 保证线程安全的延迟初始化 - 提供懒汉式和饿汉式两种变体 **实际应用场景**: | 场景 | 说明 | |------|------| | **数据库连接池** | 全局共享一个连接池实例,避免重复创建连接 | | **配置管理器** | 全局配置只加载一次,所有模块共享 | | **日志记录器** | 统一日志写入点,避免多个日志实例竞争 | | **缓存管理器** | 全局缓存实例,保证缓存一致性 | | **线程池** | 全局共享线程池,统一管理资源 | **使用建议**:优先使用 `sync.Once` 实现线程安全的单例,避免双重检查锁的复杂性。 --- ### 2. 工厂方法模式 (Factory Method) **核心思想**:定义创建对象的接口,让子类决定实例化哪个类。 **项目实现**: - `Product` 接口定义产品行为 - `Creator` 接口定义工厂方法 - 提供简单工厂模式作为补充 **实际应用场景**: | 场景 | 说明 | |------|------| | **日志框架** | 根据配置创建不同类型的日志记录器(文件日志、控制台日志、远程日志) | | **数据库驱动** | 根据数据库类型创建对应的连接驱动 | | **消息队列** | 根据配置创建不同MQ客户端(Kafka、RabbitMQ、Redis) | | **支付网关** | 根据支付方式创建不同支付处理器 | | **报表导出** | 根据格式创建不同导出器(Excel、PDF、CSV) | **使用建议**:当对象创建逻辑复杂或需要根据条件动态选择时使用。 --- ### 3. 抽象工厂模式 (Abstract Factory) **核心思想**:提供创建一系列相关或相互依赖对象的接口。 **项目实现**: - 定义 `AbstractProductA` 和 `AbstractProductB` 接口 - `AbstractFactory` 接口定义产品族创建方法 **实际应用场景**: | 场景 | 说明 | |------|------| | **UI组件库** | 创建同一风格的按钮、输入框、标签等组件 | | **数据库访问层** | 创建配套的Connection、Statement、ResultSet | | **游戏引擎** | 创建同一主题的角色、场景、道具 | | **配置系统** | 创建不同环境的配置提供者(开发、测试、生产) | | **云服务SDK** | 创建不同云厂商的服务客户端(AWS、阿里云、腾讯云) | **使用建议**:当需要创建一组相关对象时使用,确保产品族的一致性。 --- ### 4. 建造者模式 (Builder) **核心思想**:将复杂对象的构建过程与其表示分离。 **项目实现**: - `ComputerBuilder` 接口定义构建步骤 - `Director` 定义构建流程(游戏PC、办公PC) **实际应用场景**: | 场景 | 说明 | |------|------| | **HTTP请求构建** | 构建复杂的HTTP请求(URL、Header、Body、超时配置) | | **配置对象构建** | 构建包含多个可选参数的配置对象 | | **文档生成** | 构建包含标题、段落、图片、表格的文档 | | **报表构建** | 构建包含多个图表、数据区域的复杂报表 | | **消息构建** | 构建包含Header、Body、Attachment的复杂消息 | **使用建议**:当对象有多个可选参数或构建步骤复杂时使用。 --- ### 5. 原型模式 (Prototype) **核心思想**:通过复制现有对象创建新对象。 **项目实现**: - `Cloneable` 接口定义克隆方法 - 提供深拷贝(JSON序列化)和浅拷贝两种实现 **实际应用场景**: | 场景 | 说明 | |------|------| | **对象缓存** | 缓存原型对象,需要时复制使用 | | **表单模板** | 基于模板创建新表单,只需修改部分字段 | | **游戏对象复制** | 快速复制大量相似的游戏对象 | | **配置模板** | 基于基础配置创建特定配置 | | **快照功能** | 保存对象状态,支持回滚 | **使用建议**:当对象创建成本高且需要大量相似对象时使用。注意区分深拷贝和浅拷贝。 --- ## 二、结构型设计模式 ### 1. 适配器模式 (Adapter) **核心思想**:将不兼容的接口转换为兼容接口。 **项目实现**: - `Target` 定义目标接口 - `Adapter` 将 `Adaptee` 适配为目标接口 **实际应用场景**: | 场景 | 说明 | |------|------| | **第三方库集成** | 将第三方库的API适配为项目统一接口 | | **遗留系统改造** | 将旧系统接口适配为新系统接口 | | **多数据源接入** | 将不同数据源(MySQL、PostgreSQL、MongoDB)统一为一个接口 | | **日志框架适配** | 将不同日志库(log4j、zap、logrus)适配为统一接口 | | **消息格式转换** | 将XML消息转换为JSON消息 | **使用建议**:当需要集成已有代码但接口不兼容时使用。 --- ### 2. 桥接模式 (Bridge) **核心思想**:分离抽象与实现,使两者独立变化。 **项目实现**: - `Shape`(抽象)与 `Color`(实现)分离 - 支持任意形状与颜色的组合 **实际应用场景**: | 场景 | 说明 | |------|------| | **图形库** | 形状与渲染引擎分离 | | **支付系统** | 支付方式与支付渠道分离 | | **消息系统** | 消息类型与传输协议分离 | | **UI框架** | 组件与渲染平台分离 | | **报表系统** | 报表类型与输出格式分离 | **使用建议**:当需要在两个维度上扩展时使用,避免类爆炸。 --- ### 3. 组合模式 (Composite) **核心思想**:树形结构,统一处理单个对象和组合对象。 **项目实现**: - `Component` 接口统一叶子节点和组合节点 - `Directory` 可以包含 `File` 或其他 `Directory` **实际应用场景**: | 场景 | 说明 | |------|------| | **文件系统** | 目录包含文件和子目录 | | **组织架构** | 部门包含员工和子部门 | | **UI组件树** | 容器组件包含子组件 | | **菜单系统** | 菜单包含菜单项和子菜单 | | **权限系统** | 角色包含权限和子角色 | **使用建议**:当需要处理树形结构时使用。 --- ### 4. 装饰器模式 (Decorator) **核心思想**:动态添加功能,不改变原类。 **项目实现**: - `Coffee` 接口定义基础功能 - `MilkDecorator` 和 `SugarDecorator` 动态添加功能 **实际应用场景**: | 场景 | 说明 | |------|------| | **日志增强** | 为方法添加日志记录功能 | | **性能监控** | 为方法添加耗时统计 | | **权限控制** | 为方法添加权限检查 | | **缓存增强** | 为方法添加缓存功能 | | **输入验证** | 为方法添加参数验证 | **使用建议**:当需要动态添加功能且不希望使用继承时使用。 --- ### 5. 外观模式 (Facade) **核心思想**:为复杂子系统提供统一接口。 **项目实现**: - `ComputerFacade` 封装 CPU、Memory、HardDrive 的启动流程 **实际应用场景**: | 场景 | 说明 | |------|------| | **支付流程** | 封装订单创建、支付、库存扣减等步骤 | | **用户注册** | 封装用户创建、角色分配、通知发送等步骤 | | **订单处理** | 封装订单创建、支付、发货等步骤 | | **系统启动** | 封装配置加载、连接池初始化、服务注册等步骤 | | **报表生成** | 封装数据查询、计算、格式化、导出等步骤 | **使用建议**:当需要简化复杂系统的调用时使用。 --- ### 6. 享元模式 (Flyweight) **核心思想**:共享细粒度对象,减少内存开销。 **项目实现**: - `CharacterFactory` 管理字符对象池 - 相同字符复用同一个对象 **实际应用场景**: | 场景 | 说明 | |------|------| | **文本编辑器** | 共享字符对象,减少内存占用 | | **游戏粒子系统** | 共享粒子模板 | | **连接池** | 共享数据库连接 | | **线程池** | 共享线程对象 | | **对象池** | 共享可复用的对象 | **使用建议**:当需要创建大量相似对象且内存压力大时使用。 --- ### 7. 代理模式 (Proxy) **核心思想**:控制对象访问。 **项目实现**: - `ProxyImage` 实现虚拟代理(延迟加载) - `AccessProxy` 实现保护代理(权限控制) **实际应用场景**: | 场景 | 说明 | |------|------| | **延迟加载** | 按需加载重量级对象 | | **权限控制** | 检查用户权限后再访问资源 | | **远程代理** | 访问远程服务的本地代理 | | **日志记录** | 记录方法调用日志 | | **缓存代理** | 缓存方法返回值 | **使用建议**:当需要控制对象访问或添加额外逻辑时使用。 --- ## 三、行为型设计模式 ### 1. 观察者模式 (Observer) **核心思想**:一对多依赖,状态变化时通知所有观察者。 **项目实现**: - `NewsPublisher` 管理订阅者 - `NewsSubscriber` 接收通知 **实际应用场景**: | 场景 | 说明 | |------|------| | **消息通知** | 用户订阅消息,收到新消息时通知 | | **事件总线** | 系统事件发布与订阅 | | **UI更新** | 数据变化时自动更新UI | | **配置变更** | 配置变化时通知相关模块 | | **监控告警** | 指标超过阈值时通知告警系统 | **使用建议**:当需要解耦事件发布者和订阅者时使用。 --- ### 2. 迭代器模式 (Iterator) **核心思想**:遍历聚合对象,不暴露内部结构。 **项目实现**: - `Iterator` 接口定义遍历方法 - `ListIterator` 实现列表遍历 **实际应用场景**: | 场景 | 说明 | |------|------| | **集合框架** | 统一不同数据结构的遍历方式 | | **数据库分页** | 遍历分页数据 | | **文件遍历** | 遍历目录下的文件 | | **数据流处理** | 遍历数据流中的元素 | **使用建议**:当需要统一不同集合的遍历方式时使用。 --- ### 3. 策略模式 (Strategy) **核心思想**:定义算法族,可相互替换。 **项目实现**: - `PaymentStrategy` 定义支付接口 - `CreditCardPayment` 和 `PayPalPayment` 实现不同策略 **实际应用场景**: | 场景 | 说明 | |------|------| | **支付方式** | 选择不同支付策略 | | **排序算法** | 根据数据特点选择排序策略 | | **日志级别** | 根据环境选择日志策略 | | **缓存策略** | 选择不同缓存淘汰策略 | | **路由策略** | 选择不同路由算法 | **使用建议**:当需要动态切换算法或行为时使用。 --- ### 4. 模板方法模式 (Template Method) **核心思想**:定义算法骨架,步骤延迟到子类。 **项目实现**: - `Game` 接口定义游戏流程模板 - `Football` 和 `Basketball` 实现具体步骤 **实际应用场景**: | 场景 | 说明 | |------|------| | **算法框架** | 定义算法步骤,子类实现具体逻辑 | | **测试框架** | 定义测试流程,子类实现测试用例 | | **工作流引擎** | 定义流程模板,配置具体步骤 | | **报表生成** | 定义报表结构,子类填充数据 | **使用建议**:当算法框架固定但步骤可变时使用。 --- ### 5. 命令模式 (Command) **核心思想**:封装请求为对象,支持撤销/重做。 **项目实现**: - `Command` 接口定义执行和撤销方法 - `LightOnCommand` 和 `LightOffCommand` 封装具体命令 **实际应用场景**: | 场景 | 说明 | |------|------| | **撤销/重做** | 文本编辑器的撤销操作 | | **任务队列** | 将任务封装为命令放入队列 | | **远程控制** | 将操作封装为命令远程执行 | | **事务日志** | 记录命令用于故障恢复 | | **菜单操作** | 菜单点击封装为命令 | **使用建议**:当需要支持撤销、队列化或日志化操作时使用。 --- ### 6. 状态模式 (State) **核心思想**:对象状态改变时行为随之改变。 **项目实现**: - `State` 接口定义状态行为 - 订单状态机演示状态转换 **实际应用场景**: | 场景 | 说明 | |------|------| | **订单状态** | 待支付、已支付、已发货、已完成 | | **工作流状态** | 审批流程中的各个状态 | | **游戏状态** | 菜单、游戏中、暂停、结束 | | **连接状态** | 连接中、已连接、断开连接 | | **文档状态** | 草稿、审核中、已发布、已归档 | **使用建议**:当对象行为依赖于状态且状态转换复杂时使用。 --- ### 7. 职责链模式 (Chain of Responsibility) **核心思想**:请求沿链传递,直到被处理。 **项目实现**: - `Handler` 接口定义处理和传递方法 - 审批流程演示责任链 **实际应用场景**: | 场景 | 说明 | |------|------| | **审批流程** | 申请逐级审批 | | **日志记录** | 不同级别日志由不同处理器处理 | | **异常处理** | 异常沿责任链传递 | | **请求过滤** | 请求经过多个过滤器处理 | | **权限验证** | 多级权限验证 | **使用建议**:当请求需要经过多个处理步骤时使用。 --- ## 四、设计模式选择指南 | 问题场景 | 推荐模式 | |---------|---------| | 需要控制对象创建 | 单例、工厂方法、抽象工厂、建造者、原型 | | 需要优化对象结构 | 适配器、桥接、组合、装饰器、外观、享元、代理 | | 需要管理对象行为 | 观察者、迭代器、策略、模板方法、命令、状态、职责链 | | 需要解耦发送者和接收者 | 观察者、命令、职责链 | | 需要动态添加功能 | 装饰器、策略 | | 需要处理复杂对象 | 建造者、组合 | --- ## 五、总结 设计模式是解决特定问题的最佳实践总结。在实际项目中: 1. **按需选择**:根据具体问题选择合适的模式,不要为了用模式而用模式 2. **灵活组合**:多个模式可以组合使用,如工厂+策略、观察者+状态 3. **理解本质**:理解模式的核心思想,而不是机械套用 4. **权衡利弊**:每种模式都有优缺点,需要根据场景权衡 --- *文档生成时间:2026年6月*