设计模式基础入门
# 设计模式基础入门
# 七大原则
- 单一职责原则
- 接口隔离原则
- 依赖倒转原则
- 里氏替换原则
- 开闭原则 ocp
- 迪米特法则(最少知道原则)
- 合成复用原则
# 设计模式的重要性
软件工程中,设计模式是对软件设计中**普遍存在(反复出现)**的各种问题,所提出的解决方案。
# 设计模式在软件中哪里?
面向对象 -> 功能模块【设计模式 + 算法(数据结构)】 -> 框架【使用到多种设计模式】 -> 架构【服务器集群】
# 三大类别
设计模式主要分为三大类:创建型模式(Creational Patterns)、结构型模式(Structural Patterns)、行为型模式(Behavioral Patterns),共23种经典设计模式。
# 🏗️ 一、创建型模式(Creational Patterns)
核心作用:处理对象的创建,封装复杂的实例化过程,降低对象创建的复杂性,提供更灵活的创建方式。
设计模式 | 目的 | 特点 |
---|---|---|
单例模式 (Singleton) | 确保一个类只有一个实例,并提供全局访问点 | 只有一个实例,节省资源,确保一致性 |
工厂方法模式 (Factory Method) | 定义一个创建对象的接口,让子类决定实例化哪个类 | 延迟实例化,扩展性强,符合开闭原则 |
抽象工厂模式 (Abstract Factory) | 提供创建一系列相关或依赖对象的接口,无需指定具体类 | 生成一组相关产品,保证产品一致性 |
建造者模式 (Builder) | 分步创建复杂对象,允许自由组合各部分 | 复杂对象分解,简化对象的创建过程 |
原型模式 (Prototype) | 通过克隆(复制)现有对象创建新对象 | 克隆对象,避免重复创建,效率高 |
✅ 应用场景:
- 单例模式:数据库连接池、线程池、缓存。
- 工厂模式:日志类、数据库驱动加载、解析器。
- 抽象工厂模式:跨平台应用、UI 组件创建。
- 建造者模式:复杂文档生成器、HTML 构建、SQL 语句拼接。
- 原型模式:对象复制、场景重置、深拷贝与浅拷贝。
# 🧱 二、结构型模式(Structural Patterns)
核心作用:处理类与类、对象与对象之间的组合与依赖,简化系统结构,提升代码复用性和扩展性。
设计模式 | 目的 | 特点 |
---|---|---|
适配器模式 (Adapter) | 将不兼容的接口转换为可兼容的接口 | 兼容旧系统与新系统,扩展性强 |
桥接模式 (Bridge) | 将抽象和实现解耦,二者可以独立变化 | 实现和抽象分离,降低耦合,扩展方便 |
装饰器模式 (Decorator) | 动态为对象添加新的功能,无需修改其结构 | 透明扩展,灵活组合,遵循开闭原则 |
组合模式 (Composite) | 使一组对象与单个对象使用方式相同,形成树形结构 | 统一处理复杂结构,适用于层级关系 |
外观模式 (Facade) | 对外提供统一简化的接口,隐藏系统内部复杂性 | 简化客户端操作,降低系统复杂度 |
享元模式 (Flyweight) | 共享对象,减少大量相似对象带来的内存消耗 | 节省内存,适合大量重复对象场景 |
代理模式 (Proxy) | 为对象提供一个代理,控制对目标对象的访问 | 控制访问权限,延迟初始化,远程代理 |
✅ 应用场景:
- 适配器模式:API 兼容、数据库兼容、类库适配。
- 桥接模式:多维度变化的系统(如图形形状和颜色)。
- 装饰器模式:动态增加日志、权限校验、数据加密。
- 组合模式:文件系统、组织架构、菜单管理。
- 外观模式:封装子系统,提供统一接口,如 Spring 容器。
- 享元模式:缓存池、线程池、连接池、字符对象池。
- 代理模式:权限控制、RPC 远程调用、AOP 切面。
# 🔄 三、行为型模式(Behavioral Patterns)
核心作用:关注对象之间的通信和职责分配,处理类或对象之间的交互方式,降低耦合度,提高扩展性。
设计模式 | 目的 | 特点 |
---|---|---|
策略模式 (Strategy) | 定义一系列算法,封装并使它们可以互换 | 算法独立,互不影响,符合开闭原则 |
模板方法模式 (Template Method) | 定义算法骨架,延迟子类实现某些步骤 | 固定流程,子类实现差异化,代码复用 |
观察者模式 (Observer) | 定义一种订阅机制,使对象间实现一对多的依赖通知 | 发布-订阅模型,事件驱动,解耦 |
迭代器模式 (Iterator) | 提供一种方法顺序访问集合内部元素,而不暴露其内部结构 | 分离遍历逻辑,支持多种遍历方式 |
责任链模式 (Chain of Responsibility) | 将请求沿着处理链传递,链上的每个对象可对请求进行处理或传递 | 动态处理请求,简化请求处理流程 |
命令模式 (Command) | 将请求封装为对象,支持命令的参数化与撤销 | 解耦请求与执行,命令可记录与回滚 |
备忘录模式 (Memento) | 保存对象的状态,允许恢复到先前状态 | 状态恢复,撤销操作,历史记录 |
状态模式 (State) | 允许对象在内部状态变化时,改变其行为 | 行为与状态解耦,状态转换灵活 |
中介者模式 (Mediator) | 通过中介者协调多个对象的通信,避免对象间直接依赖 | 降低复杂对象依赖,集中管理交互 |
解释器模式 (Interpreter) | 定义语言语法规则,解析并执行语法表达式 | 自定义语言解析,适合DSL解析 |
访问者模式 (Visitor) | 分离数据结构和操作,新增操作而不修改数据结构 | 数据与操作分离,扩展性强 |
✅ 应用场景:
- 策略模式:支付方式、排序算法、验证码生成。
- 模板方法模式:数据导入、网络爬虫、任务调度。
- 观察者模式:消息通知、事件总线、发布订阅。
- 迭代器模式:集合遍历、数据流处理、数据库游标。
- 责任链模式:日志拦截、权限校验、审批流程。
- 命令模式:事务操作、任务队列、日志记录。
- 备忘录模式:撤销操作、游戏存档、历史记录。
- 状态模式:订单状态、工作流、权限管理。
- 中介者模式:聊天室、MVC模式、微服务通信。
- 解释器模式:SQL解析、规则引擎、表达式求值。
- 访问者模式:数据导出、代码生成、语法树遍历。
# ✅ 总结
- 创建型模式 → 解决对象创建问题,简化实例化过程。
- 结构型模式 → 解决类和对象之间的组合,增强灵活性。
- 行为型模式 → 解决对象间的通信与职责分配,提升扩展性。
# 企业开发中常用模式总结与选择
类别 | 模式名称 | 核心目的 | 主要应用场景 |
---|---|---|---|
创建型模式 | 单例模式 (Singleton) | 保证唯一实例,节省资源 | Spring Bean、数据库连接池、缓存客户端 |
创建型模式 | 工厂方法/抽象工厂 | 解耦复杂对象的创建 | 数据库操作、支付系统、多消息队列适配 |
结构型模式 | 代理模式 (Proxy) | 扩展增强、不改变原有代码 | Spring AOP、RPC 调用、权限控制 |
结构型模式 | 适配器模式 (Adapter) | 兼容不同接口 | 支付接口、数据源切换、第三方 API 兼容 |
结构型模式 | 装饰器模式 (Decorator) | 动态增强功能 | I/O 流处理、缓存增强、数据源监控 |
结构型模式 | 外观模式 (Facade) | 简化复杂系统的使用 | 订单处理、统一对外接口、微服务聚合 |
行为型模式 | 模板方法模式 | 固定算法骨架,灵活实现 | 数据导入导出、Spring JDBC Template |
行为型模式 | 策略模式 (Strategy) | 可切换的算法 | 订单状态、支付策略、数据校验 |
行为型模式 | 责任链模式 | 请求链式处理 | 权限校验、审批流、风控系统 |
行为型模式 | 观察者模式 (Observer) | 事件驱动、自动通知 | Spring 事件、消息推送、数据同步 |
行为型模式 | 命令模式 (Command) | 封装请求,支持撤销与回滚 | 数据库事务、操作记录、异步任务 |
上次更新: 2025/3/14 17:32:11