设计模式
一、创建型模式
模式 | 设计思想 | 使用场景 |
---|---|---|
单例模式 | 确保一个类仅有一个实例,并提供全局访问点 | 配置管理、线程池、数据库连接池等需全局唯一资源的场景 |
工厂方法 | 定义创建对象的接口,但由子类决定实例化哪个类 | 需要灵活扩展对象类型(如不同数据库驱动、UI主题组件) |
抽象工厂 | 提供一组相关或依赖对象的接口,无需指定具体类 | 跨平台UI库(如不同操作系统下的按钮、文本框家族) |
建造者模式 | 分步构建复杂对象,分离构造过程与表示 | 创建包含多个组件的对象(如套餐组合、XML解析器) |
原型模式 | 通过复制现有对象来创建新对象,避免重复初始化 | 对象创建成本高(如深拷贝复杂配置对象)、动态加载类 |
二、结构型模式
模式 | 设计思想 | 使用场景 |
---|---|---|
适配器模式 | 将不兼容的接口转换为客户端期望的接口 | 整合第三方库(如旧系统接口适配新系统) |
装饰器模式 | 动态地为对象添加职责,通过组合替代继承 | 扩展对象功能(如Java IO流、Web请求处理链) |
代理模式 | 为其他对象提供代理以控制访问(如延迟加载、权限校验) | 远程调用(RPC)、图片懒加载、AOP切面编程 |
组合模式 | 以树形结构组合对象,使客户端统一处理单个对象和组合对象 | 文件系统、UI组件树(如窗口包含面板和按钮) |
外观模式 | 提供统一接口简化子系统复杂调用流程 | 封装复杂子系统(如电商下单流程整合支付、库存、物流) |
三、行为型模式
模式 | 设计思想 | 使用场景 |
---|---|---|
策略模式 | 定义算法族,使其可互换,独立于客户端变化 | 支付方式选择、排序算法切换(如按价格或销量排序商品) |
观察者模式 | 定义对象间一对多依赖,一个对象状态变化时自动通知依赖对象 | 事件驱动系统(如用户登录后通知日志、邮件服务) |
命令模式 | 将请求封装为对象,支持请求排队、日志记录、撤销/重做 | 文本编辑器操作撤销、任务队列(如异步任务调度) |
模板方法 | 在父类定义算法骨架,子类实现特定步骤 | 框架流程固定但步骤可变(如JUnit测试生命周期、HTTP请求处理) |
责任链模式 | 多个处理器依次处理请求,避免请求发送者与接收者耦合 | 审批流程(如报销多级审批)、Web过滤器链(如权限校验、日志记录) |
状态模式 | 允许对象在内部状态改变时改变行为 | 游戏角色状态切换(如正常、中毒、眩晕)、订单状态流转 |