# JavaModelProject **Repository Path**: John_git_home/JavaModelProject ## Basic Information - **Project Name**: JavaModelProject - **Description**: No description available - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-06-23 - **Last Updated**: 2026-06-23 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Java 设计模式面试准备工程 > 23种GoF经典设计模式 — 示例代码 + 原理详解 + 高频面试题 ## 项目结构 ``` modelPro/ ├── pom.xml ├── README.md ← 本文件(索引) └── src/main/java/com/model/ ├── singleton/ ← 单例模式 ├── factorymethod/ ← 工厂方法模式 ├── abstractfactory/ ← 抽象工厂模式 ├── builder/ ← 建造者模式 ├── prototype/ ← 原型模式 ├── adapter/ ← 适配器模式 ├── bridge/ ← 桥接模式 ├── composite/ ← 组合模式 ├── decorator/ ← 装饰器模式 ├── facade/ ← 外观模式 ├── flyweight/ ← 享元模式 ├── proxy/ ← 代理模式 ├── chainofresponsibility/ ← 职责链模式 ├── command/ ← 命令模式 ├── interpreter/ ← 解释器模式 ├── iterator/ ← 迭代器模式 ├── mediator/ ← 中介者模式 ├── memento/ ← 备忘录模式 ├── observer/ ← 观察者模式 ├── state/ ← 状态模式 ├── strategy/ ← 策略模式 ├── templatemethod/ ← 模板方法模式 └── visitor/ ← 访问者模式 ``` ## 每个package包含两个文件 | 文件类型 | 说明 | |---------|------| | `*Demo.java` | 该设计模式的Java示例代码,可直接运行 | | `*Pattern.md` | 原理介绍 + 常用场景 + 5道高频面试题 | --- ## 一、创建型模式(Creational Patterns) 关注"如何创建对象",将对象的创建与使用分离。 ### 1. 单例模式(Singleton) | 文件 | 路径 | |------|------| | 示例代码 | `singleton/SingletonDemo.java` | | 原理与面试 | `singleton/SingletonPattern.md` | **核心**:确保一个类只有一个实例,提供全局访问点。推荐静态内部类实现。 **面试重点**:DCL为什么需要volatile | 反射/序列化破坏与防御 | Spring中的单例 --- ### 2. 工厂方法模式(Factory Method) | 文件 | 路径 | |------|------| | 示例代码 | `factorymethod/FactoryMethodDemo.java` | | 原理与面试 | `factorymethod/FactoryMethodPattern.md` | **核心**:定义创建对象的接口,让子类决定实例化哪个类。符合开闭原则。 **面试重点**:简单工厂/工厂方法/抽象工厂三者区别 | Spring FactoryBean应用 --- ### 3. 抽象工厂模式(Abstract Factory) | 文件 | 路径 | |------|------| | 示例代码 | `abstractfactory/AbstractFactoryDemo.java` | | 原理与面试 | `abstractfactory/AbstractFactoryPattern.md` | **核心**:创建一系列相关对象(产品族),保证产品间兼容性。 **面试重点**:新增产品族vs新增产品类型 | 违反开闭原则的场景 | 与建造者模式区别 --- ### 4. 建造者模式(Builder) | 文件 | 路径 | |------|------| | 示例代码 | `builder/BuilderDemo.java` | | 原理与面试 | `builder/BuilderPattern.md` | **核心**:逐步构建复杂对象,链式调用,build()返回不可变对象。 **面试重点**:与工厂模式区别 | 不可变对象结合 | telescoping constructor问题 | Lombok @Builder原理 --- ### 5. 原型模式(Prototype) | 文件 | 路径 | |------|------| | 示例代码 | `prototype/PrototypeDemo.java` | | 原理与面试 | `prototype/PrototypePattern.md` | **核心**:通过复制已有实例创建新对象,避免重复初始化开销。 **面试重点**:浅克隆vs深克隆 | Cloneable标记接口 | 序列化实现深克隆 | Spring prototype scope --- ## 二、结构型模式(Structural Patterns) 关注"如何组合类和对象"以获得更大的结构。 ### 6. 适配器模式(Adapter) | 文件 | 路径 | |------|------| | 示例代码 | `adapter/AdapterDemo.java` | | 原理与面试 | `adapter/AdapterPattern.md` | **核心**:将一个类的接口转换成客户端期望的接口,解决兼容性问题。 **面试重点**:类适配器vs对象适配器 | 与装饰器区别 | Spring HandlerAdapter | 与外观模式区别 --- ### 7. 桥接模式(Bridge) | 文件 | 路径 | |------|------| | 示例代码 | `bridge/BridgeDemo.java` | | 原理与面试 | `bridge/BridgePattern.md` | **核心**:将抽象部分与实现部分分离,两者独立变化,避免类爆炸。 **面试重点**:解决多层继承类爆炸 | 与适配器区别 | JDBC中的桥接 | 何时使用桥接 --- ### 8. 组合模式(Composite) | 文件 | 路径 | |------|------| | 示例代码 | `composite/CompositeDemo.java` | | 原理与面试 | `composite/CompositePattern.md` | **核心**:将对象组合成树形结构,统一对待叶子节点和容器节点。 **面试重点**:透明式vs安全式 | 递归遍历实现 | JDK中Container应用 | 与树结构的关系 --- ### 9. 装饰器模式(Decorator) | 文件 | 路径 | |------|------| | 示例代码 | `decorator/DecoratorDemo.java` | | 原理与面试 | `decorator/DecoratorPattern.md` | **核心**:动态给对象添加职责,通过组合而非继承扩展功能,支持链式叠加。 **面试重点**:与继承的区别 | Java I/O流装饰器 | 装饰顺序敏感性 | Spring AOP应用 --- ### 10. 外观模式(Facade) | 文件 | 路径 | |------|------| | 示例代码 | `facade/FacadeDemo.java` | | 原理与面试 | `facade/FacadePattern.md` | **核心**:为子系统提供统一的简化入口,隐藏内部复杂性。 **面试重点**:与适配器区别 | 迪米特法则 | 分层外观设计 | Spring JdbcTemplate应用 --- ### 11. 享元模式(Flyweight) | 文件 | 路径 | |------|------| | 示例代码 | `flyweight/FlyweightDemo.java` | | 原理与面试 | `flyweight/FlyweightPattern.md` | **核心**:通过共享对象减少内存,分离内部状态(共享)和外部状态(不共享)。 **面试重点**:内部状态vs外部状态 | Integer缓存池 | 与单例区别 | 线程安全 | 游戏应用 --- ### 12. 代理模式(Proxy) | 文件 | 路径 | |------|------| | 示例代码 | `proxy/ProxyDemo.java` | | 原理与面试 | `proxy/ProxyPattern.md` | **核心**:为对象提供代理以控制访问,在客户端和目标对象间插入控制层。 **面试重点**:JDK动态代理vsCGLIB | InvocationHandler原理 | 与装饰器区别 | MyBatis Mapper代理 | 虚代理 --- ## 三、行为型模式(Behavioral Patterns) 关注"对象之间的通信和职责分配"。 ### 13. 职责链模式(Chain of Responsibility) | 文件 | 路径 | |------|------| | 示例代码 | `chainofresponsibility/ChainOfResponsibilityDemo.java` | | 原理与面试 | `chainofresponsibility/ChainOfResponsibilityPattern.md` | **核心**:将请求沿链传递,直到有对象处理。解耦发送者和接收者。 **面试重点**:Servlet Filter应用 | 纯vs不纯职责链 | 动态调整链 | 与策略模式区别 --- ### 14. 命令模式(Command) | 文件 | 路径 | |------|------| | 示例代码 | `command/CommandDemo.java` | | 原理与面试 | `command/CommandPattern.md` | **核心**:将请求封装为对象,支持排队、撤销、日志记录等操作。 **面试重点**:撤销/重做实现 | Runnable是命令模式 | 与策略模式区别 | 宏命令 | 分布式应用 --- ### 15. 解释器模式(Interpreter) | 文件 | 路径 | |------|------| | 示例代码 | `interpreter/InterpreterDemo.java` | | 原理与面试 | `interpreter/InterpreterPattern.md` | **核心**:定义语言文法的类层次结构,通过解释器解释语言句子。 **面试重点**:使用频率低的原因 | 与组合模式关系 | 递归文法处理 | SpEL应用 | 适用条件 --- ### 16. 迭代器模式(Iterator) | 文件 | 路径 | |------|------| | 示例代码 | `iterator/IteratorDemo.java` | | 原理与面试 | `iterator/IteratorPattern.md` | **核心**:顺序访问聚合对象元素,不暴露内部表示。 **面试重点**:fail-fast vs fail-safe | 多种遍历方式 | forEach与Iterator关系 | Iterator为何是接口 --- ### 17. 中介者模式(Mediator) | 文件 | 路径 | |------|------| | 示例代码 | `mediator/MediatorDemo.java` | | 原理与面试 | `mediator/MediatorPattern.md` | **核心**:用中介对象封装对象间交互,各对象不需要显式互相引用。 **面试重点**:与观察者模式区别 | 避免星形依赖 | MVC中Controller角色 | 与职责链结合 --- ### 18. 备忘录模式(Memento) | 文件 | 路径 | |------|------| | 示例代码 | `memento/MementoDemo.java` | | 原理与面试 | `memento/MementoPattern.md` | **核心**:捕获对象内部状态,在外部保存,以便以后恢复。支持撤销。 **面试重点**:双接口保证封装性 | 与命令模式结合实现撤销 | 内存优化 | 游戏存档应用 --- ### 19. 观察者模式(Observer) | 文件 | 路径 | |------|------| | 示例代码 | `observer/ObserverDemo.java` | | 原理与面试 | `observer/ObserverPattern.md` | **核心**:定义一对多依赖,状态变化时通知所有依赖对象自动更新。 **面试重点**:推模型vs拉模型 | Observable废弃原因 | Spring Event机制 | 循环依赖处理 | 微服务事件驱动 --- ### 20. 状态模式(State) | 文件 | 路径 | |------|------| | 示例代码 | `state/StateDemo.java` | | 原理与面试 | `state/StatePattern.md` | **核心**:对象内部状态改变时改变行为,用多态替代条件分支。 **面试重点**:与策略模式区别 | 消除条件分支 | 状态转换由谁负责 | 工作流引擎应用 --- ### 21. 策略模式(Strategy) | 文件 | 路径 | |------|------| | 示例代码 | `strategy/StrategyDemo.java` | | 原理与面试 | `strategy/StrategyPattern.md` | **核心**:定义一系列算法,封装起来互相替换,运行时动态选择算法。 **面试重点**:开闭原则体现 | 与简单工厂结合 | 避免Context条件分支 | Spring中Resource/HandlerMapping --- ### 22. 模板方法模式(Template Method) | 文件 | 路径 | |------|------| | 示例代码 | `templatemethod/TemplateMethodDemo.java` | | 原理与面试 | `templatemethod/TemplateMethodPattern.md` | **核心**:父类定义算法骨架,子类实现具体步骤。final修饰防止重写骨架。 **面试重点**:钩子方法 | final修饰原因 | Spring refresh()应用 | 与策略模式区别 | 反转控制IoC --- ### 23. 访问者模式(Visitor) | 文件 | 路径 | |------|------| | 示例代码 | `visitor/VisitorDemo.java` | | 原理与面试 | `visitor/VisitorPattern.md` | **核心**:不改变元素类的前提下定义新操作,通过双重分派实现。 **面试重点**:双重分派机制 | 新增Element类型的困难 | 与策略模式区别 | 编译器AST应用 | 适用条件 --- ## 设计原则速查 | 原则 | 说明 | 相关模式 | |------|------|---------| | 开闭原则 | 对扩展开放,对修改关闭 | 策略、工厂方法、观察者 | | 单一职责 | 一个类只有一个变化原因 | 外观、桥接、代理 | | 依赖倒置 | 依赖抽象而非具体 | 桥接、工厂方法、策略 | | 迪米特法则 | 最少知识原则 | 外观、中介者、适配器 | | 组合优于继承 | 优先使用组合 | 桥接、装饰器、策略 | | 接口隔离 | 接口应小而专 | 适配器、桥接、外观 | ## 面试高频模式排行 > 根据大厂面试出现频率排序 | 排名 | 模式 | 频率 | 重点方向 | |------|------|------|---------| | 1 | 单例 | 极高 | volatile/防破坏/实现方式对比 | | 2 | 代理 | 极高 | JDK动态代理vsCGLIB/Spring AOP原理 | | 3 | 策略 | 高 | 与工厂结合/开闭原则/Spring应用 | | 4 | 观察者 | 高 | Spring Event/推拉模型/微服务事件驱动 | | 5 | 装饰器 | 高 | Java I/O/Spring AOP/与代理区别 | | 6 | 工厂方法 | 高 | 三种工厂对比/Spring FactoryBean | | 7 | 模板方法 | 高 | 钩子方法/Spring refresh()/IoC | | 8 | 建造者 | 中高 | Lombok原理/不可变对象/伸缩构造器 | | 9 | 职责链 | 中高 | Filter链/纯vs不纯/与策略区别 | | 10 | 适配器 | 中 | HandlerAdapter/与装饰器区别 |