!NOTE\] 前提引入 开发原则与设计模式是一种规范,是所有语言通用的 设计模式往开发原则上靠 将相似的流程业务抽取成设计模式
- 设计模式:一种可以被重复利用的解决方案。
- GoF(Gang of Four),中文名------四人组。
- 《Design Patterns: Elements of Reusable Object-Oriented Software》(即《设计模式》一书),1995年由 Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides 合著。这几位作者常被称为"四人组(Gang of Four)"。
- 该书中描述了23种设计模式。我们平常所说的设计模式就是指这23种设计模式。
- 不过除了GoF23种设计模式之外,还有其它的设计模式,比如:JavaEE的设计模式(DAO模式、MVC模式等)。
- GoF23种设计模式可分为三大类:
- 创建型 (5个):解决对象创建问题。
- 单例模式
- 工厂方法模式
- 抽象工厂模式
- 建造者模式
- 原型模式
- 结构型 (7个):一些类或对象组合 在一起的经典结构。
- 代理模式
- 装饰模式
- 适配器模式
- 组合模式
- 享元模式
- 外观模式
- 桥接模式
- 行为型 (11个):解决类或对象之间的交互问题。
- 策略模式
- 模板方法模式
- 责任链模式
- 观察者模式
- 迭代子模式
- 命令模式
- 备忘录模式
- 状态模式
- 访问者模式
- 中介者模式
- 解释器模式
- 创建型 (5个):解决对象创建问题。
🏗️ 创建型(5种)------ "怎么造对象?"
-
单例模式 :
→ 全局只允许一个实例,比如配置管理器。
-
工厂方法模式 :
→ 定义一个创建对象的接口,让子类决定实例化哪个类(把 new 拆出去)。
-
抽象工厂模式 :
→ 一次性创建一整套相关或依赖的对象族(比如 Windows 风格 vs Mac 风格 UI 组件)。
-
建造者模式 :
→ 分步骤构建一个复杂对象,且允许不同表示(如造汽车:先底盘、再引擎、最后内饰)。
-
原型模式 :
→ 通过复制现有对象来创建新对象,避免重复初始化开销("克隆"代替"new")。
🧱 结构型(7种)------ "怎么组装结构?"
-
代理模式 :
→ 用一个替身(代理)控制对真实对象的访问(如远程代理、权限代理、懒加载)。
-
装饰模式 :
→ 动态地给对象"套壳"添加功能,比继承更灵活(如 Java I/O 流的层层包装)。
-
适配器模式 :
→ 让不兼容的接口能一起工作,像电源转换插头。
-
组合模式 :
→ 把树形结构(如文件夹/文件)当成统一对象处理,"部分-整体"透明化。
-
享元模式 :
→ 共享大量细粒度对象,节省内存(如文本编辑器中重复字符共用同一对象)。
-
外观模式 :
→ 提供一个统一入口,隐藏子系统的复杂性(如一键开机:背后启动 CPU、内存、硬盘...)。
-
桥接模式 :
→ 把抽象(Abstraction)和实现(Implementation)解耦,让它们能独立变化(如形状 × 颜色:圆形/方形 + 红/蓝,避免类爆炸)。
🤝 行为型(11种)------ "怎么协作交互?"
-
策略模式 :
→ 定义一系列算法,把它们封装起来,并可互相替换(如支付方式:微信/支付宝/银联)。
-
模板方法模式 :
→ 在父类定义算法骨架,子类实现具体步骤(如做菜流程固定,但炒菜细节不同)。
-
责任链模式 :
→ 请求沿一条链传递,直到有对象处理它(如审批流:组长→经理→总监)。
-
观察者模式 :
→ 一对多依赖,当一个对象状态改变,所有依赖者自动收到通知(如订阅号推送)。
-
迭代器模式 :
→ 提供一种方法顺序访问聚合对象的元素,而不暴露其内部结构(如 for-each 背后)。
-
命令模式 :
→ 将请求封装为对象,从而参数化、排队、记录日志或撤销操作(如 Undo/Redo)。
-
备忘录模式 :
→ 在不破坏封装的前提下,捕获并外部化对象的内部状态,以便恢复(如游戏存档)。
-
状态模式 :
→ 对象行为随内部状态改变而改变,看起来像换了类(如订单状态:待支付→已发货→已完成)。
-
访问者模式 :
→ 在不修改元素类的前提下,定义作用于这些元素的新操作(如对不同报表做"导出PDF"或"生成图表")。
-
中介者模式 :
→ 用一个中介对象封装多个对象的交互,避免网状耦合(如聊天室:用户不直接通信,全走服务器)。
-
解释器模式 :
→ 为简单语法规则定义语言,并解释执行(如正则表达式、SQL 解析器------但日常少用)。
💡 总结:
设计模式不是"银弹",而是解决特定场景下软件设计问题的经验结晶 。
初学时重在理解"什么场景用什么模式 ",而非死记硬背。
真正高手,早已"无招胜有招"------模式内化于心,代码自然优雅。
Spring 大量使用了这些模式(如 BeanFactory 是工厂,AOP 是代理,事件机制是观察者......)。理解模式,就等于拿到了读懂框架源码的钥匙 🔑!