网站Logo Ilren 小记

Java 设计模式全览

jack
20
2023-05-01

Java 设计模式全览

🧠 什么是设计模式?

设计模式(Design Pattern)是经验的沉淀,是前人解决软件工程中某类问题的一套可复用方案。它并不是某种语法技巧,而是一种可迁移的设计思想,指导你写出更加结构化、灵活、可维护的代码。

它就像你开发过程中的“建筑蓝图”:

当你面对“对象如何创建?”、“对象之间如何协作?”、“如何封装变化?”等问题时,设计模式能提供清晰的指引。


🚦 为什么你应该学习设计模式?

✨ 1. 高质量代码的通行证

掌握设计模式,不仅能让你写出结构更优雅的代码,还能让团队成员更容易理解和扩展你的程序。

🧱 2. 构建可维护的系统架构

在项目扩展和迭代中,良好的模式能帮助你快速适配新需求,避免“推倒重来”。

🤝 3. 提升团队协作效率

设计模式是通用的语言,尤其在大型系统或多人协作中,可以快速传递“意图”。


🎨 Java 常用设计模式分类(23 种)

设计模式通常分为以下三大类:


Ⅰ. 创建型模式(Creational Patterns)

目的:控制对象的创建,隐藏创建逻辑,使代码与具体类解耦。

模式名 应用场景 优势
单例(Singleton) 全局唯一资源,如配置中心、线程池 控制实例数量
工厂方法(Factory Method) 子类决定实例化哪一个类 延迟创建、符合开放封闭原则
抽象工厂(Abstract Factory) 创建一组相关对象(UI 组件、主题等) 保持产品族一致性
建造者(Builder) 构建复杂对象,如 JSON、SQL 构建器 分步骤构建、清晰可读
原型(Prototype) 复制已有实例,如缓存池、克隆图形元素 避免重复初始化

Ⅱ. 结构型模式(Structural Patterns)

目的:关注类与对象的组合结构,提高系统的灵活性和可扩展性。

模式名 应用场景 优势
适配器(Adapter) 接入第三方接口、API 不兼容 接口转换
装饰器(Decorator) 增加行为功能,如日志、权限、压缩 动态增强、替代继承
代理(Proxy) 远程调用、缓存控制、权限拦截 控制访问、延迟加载
桥接(Bridge) 抽象和实现分离,如平台独立 UI 多维扩展
组合(Composite) 树形结构,如文件系统、菜单 统一单体与集合处理
外观(Facade) 提供简化入口,如 SDK 初始化 降低系统耦合
享元(Flyweight) 大量重复对象,如图标、字符池 节省内存,重用共享对象

Ⅲ. 行为型模式(Behavioral Patterns)

目的:定义对象之间的通信方式、职责分配,使系统更加灵活。

模式名 应用场景 优势
策略(Strategy) 算法切换,如支付方式、排序策略 消除条件判断
模板方法(Template Method) 统一流程,不同步骤自定义 提高复用性
观察者(Observer) 发布订阅、事件通知(如 GUI、消息系统) 低耦合通知
命令(Command) 封装请求,如按钮事件、事务日志 解耦请求发起与执行
状态(State) 状态驱动系统(订单状态、流程) 行为变化显式化
责任链(Chain of Responsibility) 请求层层传递,如日志链、请求处理器 灵活处理流程
中介者(Mediator) 多对象通信,如聊天室、表单联动 降低耦合中心化
迭代器(Iterator) 遍历集合对象,如 List、Map 避免暴露内部结构
访问者(Visitor) 不修改结构的前提下添加操作 多维扩展操作
备忘录(Memento) 撤销恢复操作(如编辑器) 保持封装性
解释器(Interpreter) 定义文法、表达式求值 构建 DSL

🧭 Java 设计模式常用原则(SOLID)

在学习设计模式之前,理解下面五大设计原则有助于你更好地“看懂”模式背后的动机:

原则 含义
S - 单一职责(SRP) 一个类只负责一件事
O - 开闭原则(OCP) 对扩展开放,对修改关闭
L - 里氏替换(LSP) 子类必须能够替换父类
I - 接口隔离(ISP) 接口应小而专一
D - 依赖倒置(DIP) 依赖抽象而非具体实现

设计模式就是这些原则的具体实现组合应用


🧰 设计模式 ≠ 框架,关键是“何时用、为何用”

不要为了用而用。只有在:

  • 系统复杂度升高、变化频繁时;
  • 你想提高代码复用、避免重复造轮子;
  • 你想提升系统的可测试性、可维护性;

才真正需要用到设计模式。

设计模式是一把“双刃剑”,用得对,是强大工具;用得不当,是过度设计。


📚 参考资料


一个写代码的人,也写字,记录风吹过生活的声音。🌿

动物装饰