# 八股-设计模式 | **问题** | **技术性回答 (关键词)** | **小白都能看懂的解释** | | ---------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------- | | **String 的设计用到了哪些模式?** | 1. **享元模式** (String Pool 字符串常量池,复用对象)。<br>2. **不可变模式** (Immutable,`final` 修饰字符数组,保证安全)。 | 1. **享元**:像共享单车,大家共用这一辆,不用每人都买一辆。<br>2. **不可变**:写在花岗岩上的字,刻上去就改不了,非常安全,怎么传都不会变。 | | **三种工厂模式的区别?** | **简单工厂**:一个工厂类包办所有,违背开闭原则 (OCP)。<br><br>**工厂方法**:一类产品对应一个工厂类,符合 OCP。<br><br>**抽象工厂**:创建“产品族” (一整套相关的产品)。 | **简单工厂**:像个路边摊,既炒饭也炒面。<br><br> <br><br>**工厂方法**:像肯德基,只做炸鸡;麦当劳,只做汉堡。<br><br> <br><br>**抽象工厂**:像宜家,卖的是“全屋定制”,不仅卖桌子,还配好配套的椅子和地毯。 | | **不使用锁如何实现单例?** | 1. **饿汉式** (类加载时直接创建)。<br><br>2. **静态内部类** (利用 ClassLoader 机制保证线程安全且懒加载)。<br><br> <br><br>3. **枚举** (JVM 保证唯一)。 | 1. **饿汉**:还没搬进新家,家具就已经买好摆在那了。<br><br> <br><br>2. **内部类**:房子盖好不买家具,等你要用时,厂家瞬间发货且保证只发一件。 | | **为什么枚举是实现单例最好的方式?** | 1. **防反射攻击**:JVM 层面禁止反射创建枚举实例。<br>2. **防序列化破坏**:枚举自带序列化机制,反序列化不会创建新对象。<br><br> <br><br>3. **线程安全**:代码简洁。 | 它是“皇粮”,国家(JVM)认证的唯一。黑客想造假(反射)造不出来,复印(序列化)出来的也是原件,根本破坏不了。 | | **什么是不可变模式?应用?** | **定义**:对象创建后状态不可改。<br>**应用**:`String`, `Integer` 等包装类, `BigDecimal`。并发环境下天然线程安全。 | 此文件为“只读 PDF”。你想修改?对不起,只能“另存为”一个新文件,原文件纹丝不动。 | | **什么是[[享元模式]]?应用?** | **定义**:缓存共享对象,减少内存消耗。区分内部状态(共享)和外部状态(不共享)。<br><br> <br><br>**应用**:`String` 常量池, `Integer.valueOf` (-128~127), 数据库连接池。 | 公共图书馆。书(对象)只有一本,谁要看就借给谁,大家轮流用,不用每人买一本。 | | **什么是[[代理模式]]?应用?** | **定义**:通过代理对象控制对原对象的访问,增强功能。<br><br> <br><br>**类型**:静态代理, 动态代理 (JDK/CGLib)。<br><br> <br><br>**应用**:Spring AOP (日志、事务), RPC 远程调用。 | 明星的经纪人。你要找明星(原对象)演戏,得先过经纪人(代理)这关。经纪人负责谈合同、收钱(增强功能),最后才让明星露个脸。 | | **什么是模板方法模式?应用?** | **定义**:父类定义算法骨架,子类实现具体步骤。<br><br> <br><br>**应用**:AQS (`tryAcquire`), Servlet (`doGet`/`doPost`), Spring `JdbcTemplate`。 | 填空题。卷子(父类)已经把题目出好了,格式也定好了,你(子类)只需要在横线上填你的答案。 | | **什么是[[状态模式]]?应用?** | **定义**:对象内部状态改变时,行为随之改变。消除复杂的 `if-else`。<br>**应用**:订单状态机 (待支付->已发货), 游戏角色状态 (正常/眩晕/无敌), TCP 连接状态。 | 变色龙。心情好是绿色,心情不好是红色。或者像红绿灯,红灯停,绿灯行,灯(状态)变了,车的行为就得变。 | | **什么是[[观察者模式]]?应用?** | **定义**:一对多依赖,被观察者变动自动通知观察者。<br>**应用**:GUI 事件监听, Zookeeper Watcher, 消息队列 (Pub/Sub), Vue 双向绑定。 | 订阅报纸(或关注 Up 主)。只要报社一发新报纸(Up 主更新),就会自动送到你家门口(手机推送到你面前)。 | | **什么是设计模式?好处?** | **定义**:软件开发中常见问题的典型解决方案。<br>**好处**:代码重用、高可维护性、解耦、团队沟通的通用语言。 | **菜谱**。你想做红烧肉,不用自己瞎捉摸怎么炒,照着大师总结好的菜谱做,做出来味道肯定不差,而且别的厨师一看就懂。 | | **什么是[[责任链模式]]式?应用?** | **定义**:请求在链条上传递,直到有对象处理它。<br>**应用**:Servlet Filter, Spring Security 拦截器, Netty ChannelHandler, OA 审批流。 | 击鼓传花,或者层层审批。你请假,组长批不了给经理,经理批不了给老板,一级级往后传。 | | **工作如何使用设计模式?** | **策略模式**:不同渠道支付/物流。<br><br> <br><br>**模板方法**:数据导出/报表生成。<br><br> <br><br>**建造者**:复杂配置对象构建。<br><br> <br><br>**工厂**:统一管理 Service 实例。 | 我不写死代码。比如支付,我设计成插拔式的,今天接微信支付,明天接支付宝,插上去就能用,不用改核心代码。 | | **哪种模式提高可维护性?** | **工厂模式** (解耦创建与使用), **策略模式** (解耦算法与调用), **状态模式** (解耦状态逻辑)。 | **模块化家具**。坏了一个抽屉,只换抽屉就行,不用把整个桌子扔了。 | | **哪种模式提高复用性?** | **[[模板模式**, **[[装饰器模式]]**, [[适配器模式]]。 | **万能转接头**。不管你是圆孔插座还是方孔插座,我都能把这台电脑插上去用。 | | **单例模式的多种写法?** | 1. **饿汉式** (Static final field)。<br>2. **懒汉式** (Sync method, 效率低)。<br>3. **DCL 双重检查锁** (volatile + synchronized)。<br>4. **静态内部类**。<br>5. **枚举**。 | 1. 现成的。<br>2. 现做的(排队拿)。<br>3. 现做的(看一眼没人排队再冲进去拿)。<br>4. 藏在仓库里的。<br>5. 国家发的。 | | **如何破坏单例?** | 1. **反射** (`setAccessible(true)` 强行调用私有构造)。<br>2. **序列化** (反序列化会 `new` 新对象,除非写 `readResolve`)。<br>3. **Unsafe** 类。 | 1. **反射**:私闯民宅,撬锁进去。<br>2. **序列化**:用 3D 打印机克隆了一个一模一样的。 | | **策略模式 vs if-else?** | **好处**:符合开闭原则,扩展新策略不修改旧代码;逻辑清晰,易于单元测试。<br>**坏处**:类变多了。 | **if-else** 是把所有游戏卡带都焊死在游戏机里,想玩新的得拆机器。<br>[[策略模式]] 是插卡槽,想玩新游戏,买个新卡带(新类)插进去就行。 | | **设计模式 7 大原则?** | **SOLID** (单一职责, 开闭, 里氏替换, 接口隔离, 依赖倒置) + **迪米特法则** (最少知道) + **合成复用原则**。 | **盖房准则**:地基要稳(SRP),扩建不能拆承重墙(OCP),水管电线要分开(ISP),尽量用组合柜少用胶水粘(合成复用)。 | | **MVC 模式的思想?** | **Model** (数据模型), **View** (视图展示), **Controller** (业务逻辑)。**核心**:关注点分离 (SoC),低耦合。 | **饭店**。<br>**View**:菜单(给客人看的)。<br>**Controller**:服务员(接单、传话)。<br>**Model**:后厨(负责把菜做出来,不直接见客人)。 | ## 面试题 - String的设计,用到了哪些设计模式? - 三种工厂模式的区别和特点 - 不使用锁如何实现线程安全的单例? - 为什么说枚举是实现单例最好的方式? - 什么是不可变模式,有哪些应用? - 什么是享元模式,有哪些具体应用? - 什么是代理模式,有哪些应用? - 什么是模板方法模式,有哪些应用? - 什么是状态模式,有哪些应用? - 什么是观察者模式,有哪些应用? - 什么是设计模式?有什么好处? - 什么是责任链模式,有哪些应用? - 你在工作中是如何使用设计模式的? - 使用哪种设计模式可以提高代码可维护性? - 使用哪种设计模式可以提高代码的复用性? - 单例模式的多种写法 - 如何破坏单例模式? - 策略模式和if-else相比有什么好处? - 设计模式的7大基本原则有哪些? - 请简述MVC模式的思想