设计模式面试介绍指南
一、设计模式概述
设计模式 是解决特定问题的可复用方案 ,不是具体代码,而是设计思想。就像建筑图纸,告诉你"怎么设计",而不是"用什么砖"。
核心价值:
-
提高代码可维护性(别人容易看懂)
-
提高代码可扩展性(加功能不改旧代码)
-
提高代码复用性(一套方案多处用)
-
提高代码灵活性(适应需求变化)
二、单例模式(Singleton)
一句话介绍
"一个类只能创建一个对象,全局共享使用。"
适用场景
-
数据库连接池(整个系统用一个)
-
配置管理类(配置信息全局一份)
-
日志工具类(所有地方写同一个日志文件)
-
线程池(统一管理线程)
核心思想
// 饿汉式(简单直接,线程安全)
public class Singleton {
private static final Singleton instance = new Singleton();
private Singleton() {} // 私有构造,防止外部new
public static Singleton getInstance() {
return instance;
}
}
// 懒汉式(需要时才创建,双重检查锁)
public class Singleton {
private static volatile Singleton instance;
private Singleton() {}
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
面试回答示例
"单例模式确保一个类只有一个实例,并提供全局访问点。比如我们项目中的配置管理类,所有模块都要读取配置,如果每个地方都new一个,不仅浪费内存,还可能配置不一致。用单例模式,整个系统共享一份配置,修改一处,所有地方都生效。"
三、工厂模式(Factory)
一句话介绍
"不直接new对象,让工厂帮你创建,隐藏创建细节。"
适用场景
-
创建复杂对象(需要很多参数)
-
需要统一管理对象创建
-
需要根据条件创建不同对象
-
解耦对象创建和使用
核心思想
// 简单工厂
public class CarFactory {
public static Car createCar(String type) {
if ("Benz".equals(type)) {
return new Benz();
} else if ("BMW".equals(type)) {
return new BMW();
}
return null;
}
}
// 使用
Car car = CarFactory.createCar("Benz");
car.run();
// 工厂方法模式(更灵活)
public interface CarFactory {
Car createCar();
}
public class BenzFactory implements CarFactory {
@Override
public Car createCar() {
return new Benz();
}
}
面试回答示例
"工厂模式将对象的创建和使用分离。比如我们项目要对接多个支付渠道(微信、支付宝、银联),每个支付方式创建逻辑不同。如果用if-else直接new,代码会越来越臃肿。用工厂模式,把创建逻辑封装在工厂里,业务代码只需要调用工厂方法,不用关心具体创建过程。这样新增支付方式时,只需要扩展工厂,不用修改原有代码,符合开闭原则。"
四、面试技巧
1. 不要背概念
-
不要说"单例模式是创建型模式,确保一个类只有一个实例..."
-
要说"我们项目里有个配置管理类,用单例模式保证全局只有一份"
2. 结合项目经验
-
单例:配置管理、日志工具、数据库连接池
-
工厂:支付工厂、数据源工厂、消息队列工厂
3. 说明优缺点
-
单例:节省资源,但可能成为"上帝对象",不好测试
-
工厂:解耦,但增加复杂度,简单场景没必要
4. 提到设计原则
-
开闭原则:对扩展开放,对修改关闭(工厂模式符合)
-
单一职责:一个类只做一件事(工厂只负责创建)
-
依赖倒置:依赖抽象,不依赖具体(工厂方法模式)
5. 对比其他模式
-
单例 vs 静态类:单例可以继承、实现接口,更灵活
-
简单工厂 vs 工厂方法:简单工厂用if-else,工厂方法用多态,更符合开闭原则
总结 :设计模式不是炫技,而是解决问题的工具。用对了提升代码质量,用错了增加复杂度。面试时重点说明"为什么用"和"解决了什么问题",而不是"怎么实现"。