设计模式面试题汇总

153 阅读3分钟

面试题

原型模式相关

用 UML 类图画出原型模式的核心角色

UML 图中的类图 ?

UML 图的分类 含状态图

原型模式图?

用原型设计模式的深拷贝和浅拷贝是什么?并且写出深拷贝的两种源码方式

(重写 clone 的方法实现深拷贝,第二种是用序列化的方式来实现深拷贝)

sping 框架中哪里用到了原型模式,要求你对源码进行分析

Spring 中原型 Bean 的创建就用了原型模式,下面通过代码分析以及 Debug 源代码来进行解答

maven 项目中,创建一个类 Practice1 如下:

package pattern_design.prototype;

public class Practice1 {
    public void helloWorld(){
        System.out.println("hello world!");
    }
}

在 Bean.xml 文件中,bean 标签内设置 scope 属性为 prototype ,译为原型,即使用了原型模式:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:content="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
    <bean id="prac_1" class="pattern_design.prototype.Practice1" scope="prototype"></bean>
</beans>
package main;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import pattern_design.prototype.Practice1;

public class Test {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("spring_config.xml");
        Practice1 practice1 = (Practice1) context.getBean("prac_1");
        practice1.helloWorld();
    }
}

控制台展示:

"C:\Program Files\Java\jdk1.8.0_192\bin\java.exe" "-javaagent:C:\Program .... beans\5.2.3.RELEASE\spring-beans-5.2.3.RELEASE.jar" main.Test
hello world!

Process finished with exit code 0

源码层面经过了以下的调用:

image.png

image.png

image.png

image.png

image.png

开闭原则

设计模式的七大原则是什么?

主要回答七大原则的核心思想

以类图来说明设计原则

在你实际的开发中,你在哪里使用到的 OCP 原则

工厂模式使用了 ocp 原则

项目里的设计模式

①金融借贷平台

金融借贷平台项目:借贷平台的订单,审核-发布-抢单等步骤。随着不同的操作,会改变订单的状态,项目中这个模块实现会用到状态模式,请你使用状态模式进行设计并完成实际的代码

问题分析: 这种问题主要考虑代码的扩展性,即代码要灵活适应需求的变化。没有学过设计模式的同学,一般都会使用 if-else 这样的分支语句。问题来了,当新增一种状态时,需要在 if else 中手动添加。而当新增功能时,则对所有状态进行判断。总而言之,if else 的编写思路让代码日渐臃肿并且低效,那么使用状态模式会有怎么样的改进呢? 首先,先画一个状态转化图,即状态图,是 UML 图的一种,

订单生成、已审核、已发布、待付款、已付款、已完结等等这样几个状态,那么在这个状态的过程中我们有很多事件,对吧?也就是说一边是事件,一边是状态,那么对应的就是我们状态的变化。

解释器设计模式

介绍解释器设计模式

画出解释器设计模式 UML 类图,并分析解释器设计模式的各个角色是什么

请说明在 spring 框架中哪里用到了解释器设计模式,并进行源码的分析

Spring 框架中 SpelExpressionParser

单例设计模式

单例设计模式一共有几种实现方式,请分别用代码实现,并说明各个实现方式的优点和缺点。 单例设计模式实际上有八种写法,哪八种呢? 1)饿汉模式 —— 两种 2)懒汉模式 —— 三种 3)双重检查 4)静态内部类 5)枚举