设计模式简要介绍
设计模式是面向对象编程中解决特定问题的标准化方案,三大类(创建型、结构型、行为型)各有其核心特点和适用场景。以下是各类模式中常用模式的特点总结:
一、创建型模式(Creational Patterns)
核心目标:控制对象的创建过程,隐藏创建细节,提高灵活性。
共同特点:封装对象创建逻辑,使客户端无需关注"如何创建",只需关注"使用对象"。
模式名称 | 核心特点 | 典型应用场景 |
---|---|---|
单例模式 | 确保一个类仅存在一个实例,并提供全局访问点。 | 配置管理器、日志对象、线程池(避免资源重复占用)。 |
工厂方法模式 | 定义创建对象的接口,由子类决定具体实例化哪个类(延迟实例化到子类)。 | 框架中的对象创建(如Spring的BeanFactory)、数据库驱动选择(MySQL/PostgreSQL)。 |
抽象工厂模式 | 提供一个接口,用于创建一系列相关或依赖的对象家族,无需指定具体类。 | 跨平台组件库(如不同操作系统的按钮、文本框风格统一)、数据库连接池+事务管理器组合。 |
建造者模式 | 将复杂对象的构建过程与表示分离,允许分步构建不同表示的对象。 | 复杂对象创建(如SQL查询构建器、StringBuilder、对象序列化)。 |
原型模式 | 通过复制现有对象创建新对象,避免重复初始化开销。 | 大对象复制(如缓存中的对象克隆)、多线程场景下的对象隔离(每个线程一个原型副本)。 |
二、结构型模式(Structural Patterns)
核心目标:处理类或对象的组合关系,实现更灵活的结构。
共同特点:通过继承或组合将不同类/对象组织成更强大的结构,同时保持松耦合。
模式名称 | 核心特点 | 典型应用场景 |
---|---|---|
适配器模式 | 将一个类的接口转换为客户端期望的另一个接口,解决兼容性问题。 | 新旧系统集成(如Java的InputStreamReader将字节流适配为字符流)、第三方库接口适配。 |
装饰器模式 | 动态地给对象添加额外职责,不改变原有类结构(比继承更灵活)。 | 功能增强(如Java IO的BufferedReader装饰InputStream、Spring的AOP增强方法)。 |
代理模式 | 为对象提供代理层,控制对原对象的访问(如权限控制、延迟加载)。 | 远程代理(RPC调用)、虚拟代理(大图片延迟加载)、保护代理(权限校验)。 |
桥接模式 | 将抽象与实现分离,使两者可独立变化(解决多维度变化导致的类爆炸)。 | 跨平台组件(如形状-颜色组合:圆形/方形与红/蓝独立变化)、消息发送(内容-渠道分离)。 |
组合模式 | 将对象组合成树形结构,使单个对象和组合对象的使用方式一致。 | 树形结构操作(如文件系统目录、组织架构树、XML节点解析)。 |
外观模式 | 为复杂系统提供统一入口(简化接口),隐藏内部复杂性。 | 框架对外接口(如JDBC的DriverManager封装底层数据库细节)、子系统集成。 |
享元模式 | 复用大量细粒度对象(共享内部状态),减少内存占用。 | 池化技术(线程池、连接池)、常量池(String常量池)、游戏中的重复角色模型。 |
三、行为型模式(Behavioral Patterns)
核心目标:处理对象间的交互与职责分配,实现松耦合的通信。
共同特点:关注对象行为的协作,通过模式规范交互方式,提高可扩展性。
模式名称 | 核心特点 | 典型应用场景 |
---|---|---|
策略模式 | 定义一系列算法,封装每个算法并使它们可互换(客户端动态选择算法)。 | 支付方式选择(信用卡/支付宝)、排序算法切换、折扣策略(满减/打折)。 |
观察者模式 | 定义一对多依赖关系,当对象状态变化时,所有依赖者自动收到通知。 | 事件监听(GUI按钮点击)、消息订阅(发布-订阅模式)、状态同步(缓存更新通知)。 |
模板方法模式 | 定义算法骨架,将步骤延迟到子类实现(固定流程,灵活实现细节)。 | 框架模板(如Spring的JdbcTemplate固定数据库操作流程)、生命周期方法(初始化-执行-销毁)。 |
迭代器模式 | 提供一种方法遍历聚合对象,无需暴露内部结构(统一遍历接口)。 | 集合遍历(Java的Iterator接口)、数据库结果集遍历、自定义容器遍历。 |
命令模式 | 将请求封装为对象,使请求可参数化、队列化或记录日志(解耦请求者与执行者)。 | 命令队列(任务调度)、撤销操作(如文本编辑器的Ctrl+Z)、事件总线。 |
责任链模式 | 将请求的处理者连成链,请求沿链传递,直到被处理(解耦请求与处理)。 | 权限校验链(多层级审批)、日志过滤链(按级别过滤)、异常处理链。 |
状态模式 | 允许对象在内部状态变化时改变行为,使对象看起来像修改了类。 | 状态机(订单状态:待支付→已支付→已发货)、游戏角色状态( idle→attack→defense)。 |
访问者模式 | 分离对象数据结构与操作,使操作可独立扩展(为不同元素添加新操作)。 | 复杂对象结构的多维度操作(如报表生成:同一数据生成不同格式报表)、AST语法树解析。 |
总结:设计模式的核心价值
- 标准化沟通:提供通用术语(如"单例"、“观察者”),使团队协作更高效。
- 解耦与灵活:通过封装、继承、组合等技巧,降低代码耦合度,提高可扩展性。
- 经验复用:将前人解决问题的经验抽象为模式,避免重复造轮子。
使用设计模式的关键是"理解场景而非死记实现"——过度设计(为用模式而用模式)反而会增加复杂性,应根据实际问题选择合适的模式。