在Java面试中设计模式是一个高频考点它不仅考察你对面向对象编程的理解还测试你解决实际问题的能力。掌握经典设计模式不仅能让你在面试中脱颖而出还能提升你的代码质量。本文将介绍几种常见的设计模式并通过经典题目和解题思路来帮助你深入理解。1. 单例模式Singleton Pattern单例模式确保一个类只有一个实例并提供一个全局访问点。这是最常用的设计模式之一。经典题目实现一个线程安全的单例类。解题思路- 使用私有构造函数防止外部实例化。- 使用静态内部类来延迟加载避免资源浪费。- 使用双重检查锁定Double-Checked Locking确保线程安全。javapublic class Singleton {private Singleton() {}public static Singleton getInstance() {return SingletonHolder.INSTANCE;}private static class SingletonHolder {private static final Singleton INSTANCE new Singleton();}}2. 工厂模式Factory Pattern工厂模式提供了一种创建对象的方式而无需指定具体的类。它分为简单工厂、工厂方法和抽象工厂。经典题目创建一个图形绘制系统支持多种图形的绘制。解题思路- 定义一个图形接口如 Shape。- 创建具体的图形类如 Circle、Rectangle。- 创建一个工厂类如 ShapeFactory根据输入参数返回相应的图形对象。javapublic interface Shape {void draw();}public class Circle implements Shape {Overridepublic void draw() {System.out.println(Drawing Circle);}}public class Rectangle implements Shape {Overridepublic void draw() {System.out.println(Drawing Rectangle);}}public class ShapeFactory {public Shape getShape(String shapeType) {if (shapeType null) {return null;}if (shapeType.equalsIgnoreCase(CIRCLE)) {return new Circle();} else if (shapeType.equalsIgnoreCase(RECTANGLE)) {return new Rectangle();}return null;}}3. 观察者模式Observer Pattern观察者模式定义了对象之间的一对多依赖关系当一个对象改变状态时所有依赖它的对象都会得到通知并自动更新。经典题目实现一个天气预报系统当天气数据发生变化时通知所有显示面板。解题思路- 定义一个观察者接口如 Observer。- 定义一个被观察者接口如 Subject。- 创建具体的观察者类如 CurrentConditionsDisplay、StatisticsDisplay。- 创建具体的被观察者类如 WeatherData维护一个观察者列表并在状态改变时通知所有观察者。javapublic interface Observer {void update(float temperature, float humidity, float pressure);}public interface Subject {void registerObserver(Observer o);void removeObserver(Observer o);void notifyObservers();}public class WeatherData implements Subject {private List observers;private float temperature;private float humidity;private float pressure;public WeatherData() {observers new ArrayList();}Overridepublic void registerObserver(Observer o) {observers.add(o);}Overridepublic void removeObserver(Observer o) {observers.remove(o);}Overridepublic void notifyObservers() {for (Observer observer : observers) {observer.update(temperature, humidity, pressure);}}public void measurementsChanged() {notifyObservers();}public void setMeasurements(float temperature, float humidity, float pressure) {this.temperature temperature;this.humidity humidity;this.pressure pressure;measurementsChanged();}}4. 装饰器模式Decorator Pattern装饰器模式允许向一个现有的对象添加新的功能同时又不改变其结构。这种类型的设计模式属于结构型模式。经典题目实现一个饮料订单系统支持多种调料的添加。解题思路- 定义一个饮料接口如 Beverage。- 创建具体的饮料类如 Espresso、HouseBlend。- 创建调料装饰器类如 Milk、Mocha继承自 Beverage 并持有对原始饮料的引用。javapublic abstract class Beverage {protected String description Unknown Beverage;public String getDescription() {return description;}public abstract double cost();}public class Espresso extends Beverage {public Espresso() {description Espresso;}Overridepublic double cost() {return 1.99;}}public class HouseBlend extends Beverage {public HouseBlend() {description House Blend Coffee;}Overridepublic double cost() {return 0.89;}}public abstract class CondimentDecorator extends Beverage {public abstract String getDescription();}public class Milk extends CondimentDecorator {private Beverage beverage;public Milk(Beverage beverage) {this.beverage beverage;}Overridepublic String getDescription() {return beverage.getDescription() , Milk;}Overridepublic double cost() {return 0.10 beverage.cost();}}5. 代理模式Proxy Pattern代理模式为其他对象提供一种代理以控制对这个对象的访问。它常用于延迟加载、访问控制和日志记录。经典题目实现一个远程服务调用的代理隐藏底层的网络通信细节。解题思路- 定义一个服务接口如 Service。- 创建一个具体的远程服务类如 RemoteService。- 创建一个代理类如 ServiceProxy持有对远程服务的引用并在调用时进行必要的处理如连接管理、异常处理。javapublic interface Service {void doSomething();}public class RemoteService implements Service {Overridepublic void doSomething() {System.out.println(Doing something on remote server);}}public class ServiceProxy implements Service {private RemoteService remoteService;Overridepublic void doSomething() {if (remoteService null) {remoteService new RemoteService();}remoteService.doSomething();}}掌握这些设计模式不仅能帮助你在面试中展示你的技术实力还能让你在实际开发中写出更加灵活、可维护的代码。希望本文能为你在Java面试中提供有价值的参考。