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) | 依赖抽象而非具体实现 |
设计模式就是这些原则的具体实现或组合应用。
🧰 设计模式 ≠ 框架,关键是“何时用、为何用”
不要为了用而用。只有在:
- 系统复杂度升高、变化频繁时;
- 你想提高代码复用、避免重复造轮子;
- 你想提升系统的可测试性、可维护性;
才真正需要用到设计模式。
设计模式是一把“双刃剑”,用得对,是强大工具;用得不当,是过度设计。
📚 参考资料
- 《Head First 设计模式》
- 《设计模式:可复用面向对象软件的基础》GoF
- 《Effective Java》 — Joshua Bloch
- Refactoring Guru - https://refactoring.guru/design-patterns
一个写代码的人,也写字,记录风吹过生活的声音。🌿