设计模式面试介绍指南

设计模式面试介绍指南

一、设计模式概述

设计模式 是解决特定问题的可复用方案 ,不是具体代码,而是设计思想。就像建筑图纸,告诉你"怎么设计",而不是"用什么砖"。

核心价值

  • 提高代码可维护性(别人容易看懂)

  • 提高代码可扩展性(加功能不改旧代码)

  • 提高代码复用性(一套方案多处用)

  • 提高代码灵活性(适应需求变化)


二、单例模式(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,工厂方法用多态,更符合开闭原则

总结 :设计模式不是炫技,而是解决问题的工具。用对了提升代码质量,用错了增加复杂度。面试时重点说明"为什么用"和"解决了什么问题",而不是"怎么实现"。

相关推荐
小北方城市网10 小时前
GEO 全场景智能生态:自适应架构重构与极限算力协同落地
开发语言·人工智能·python·重构·架构·量子计算
怦怦蓝10 小时前
详解 IntelliJ IDEA 中编写邮件发送功能(从环境搭建到实战落地)
java·spring boot·intellij-idea
DENG86230410 小时前
二、使用idea运行Quarkus项目及调试
java·intellij-idea·quarkus
十五年专注C++开发10 小时前
CMake进阶:核心命令get_filename_component 完全详解
开发语言·c++·cmake·跨平台编译
sww_102610 小时前
Spring AI Structured-Output源码分析
java·人工智能·spring
Blossom.11810 小时前
工业级扩散模型优化实战:从Stable Diffusion到LCM的毫秒级生成
开发语言·人工智能·python·深度学习·机器学习·stable diffusion·transformer
IT_Octopus10 小时前
java 实体属性 Map 解决 mybatis-plus wrapper selectone 查mysql json类型为null 问题
java·mysql·mybatis
嘿嘿潶黑黑10 小时前
关于QButtonGroup 在Qt5和Qt6之间的差异
开发语言·qt