一文整理总结常见Java后端面试题系列——设计模式篇(2022最新版)

设计模式面试题总结(2022最新版)

关于作者
🐶 程序猿周周
⌨️ 短视频小厂BUG攻城狮
🤺 如果文章对你有帮助,记得关注、点赞、收藏,一键三连哦,你的支持将成为我最大的动力


关于本文
本文是 Java 面试总结系列的第1️⃣2️⃣篇文章,该专栏将整理和梳理笔者作为 Java 后端程序猿在日常工作以及面试中遇到的实际问题,通过这些问题的系统学习,也帮助笔者顺利拿到阿里、字节、华为、快手等Offer,也祝愿大家能够早日斩获自己心仪的Offer。由于笔者能力有限,如若有错误或疏忽还望各位大佬们不吝指出…

标题 地址
MySQL数据库面试题总结(2022版) https://blog.csdn.net/adminpd/article/details/122910606
Redis面试题总结(2022版) https://blog.csdn.net/adminpd/article/details/122934938
计算机网络面试题总结(2022版) https://blog.csdn.net/adminpd/article/details/122973684
操作系统面试题总结(2022版) https://blog.csdn.net/adminpd/article/details/122994599
Linux面试题总结(2022版) https://blog.csdn.net/adminpd/article/details/122994862
Spring面试题总结(2022版) https://blog.csdn.net/adminpd/article/details/123016872
Java基础面试题总结(2022版) https://blog.csdn.net/adminpd/article/details/123080189
Java集合面试题总结(2022版) https://blog.csdn.net/adminpd/article/details/123171501
Java并发面试题总结(2022版) https://blog.csdn.net/adminpd/article/details/123266624
Java虚拟机面试题总结(2022版) https://blog.csdn.net/adminpd/article/details/123412605
Java异常面试题总结(2022版) https://blog.csdn.net/adminpd/article/details/123462676
设计模式面试题总结(2022版) https://blog.csdn.net/adminpd/article/details/123490442

1 概念

1、什么是设计模式?

设计模式是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性、程序的重用性。

2、使用设计模式的好处?

  • 设计模式可在多个项目中重用。

  • 设计模式提供了一个帮助定义系统架构的解决方案。

  • 设计模式吸收了软件工程的经验。

  • 设计模式为应用程序的设计提供了透明性。

  • 设计模式是被实践证明切实有效的,由于它们是建立在专家软件开发人员的知识和经验之上的。

3、设计模式六大原则?

1)单一责任原则(Principle of single responsibility):一个类或者一个方法只负责一项职责。

2)里氏替换原则(Liskov Substitution Principle):使用基类的任何地方可以使用继承的子类,完美的替换基类。

3)依赖倒转原则(Dependence Inversion Principle):其核心思想是面向接口编程。

4)接口隔离原则(Interface Segregation Principle):使用多个隔离的接口,比使用单个接口要好。还是一个降低类之间的耦合度的意思。

5)迪米特法则(Demeter Principle):最少知道原则,一个对象应当对其他对象有尽可能少地了解,简称类间解耦。

6)开闭原则(Open Close Principle):尽量通过扩展软件实体来解决需求变化,而不是通过修改已有的代码来完成变化。

一文整理总结常见Java后端面试题系列——设计模式篇(2022最新版)

4、设计模式如何分类?

通常情况下,我们可以将常用的 23 种设计模式分为创建模式结构模式以及行为模式三种类型。

一文整理总结常见Java后端面试题系列——设计模式篇(2022最新版)

  • 创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。

  • 结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。

  • 行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代器模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。

2 创建型模式

2.1 单例模式

  • 什么是单例模式

保证一个类只有一个实例,并且提供一个访问该全局访问点。

  • 单例模式的应用

1)应用程序的日志应用,一般都可用单例模式实现,这一般是由于共享的日志文件一直处于打开状态,因为只能有一个实例去操作,否则内容不好追加。

2)数据库连接池的设计一般也是采用单例模式,因为数据库连接是一种数据库资源。

3)多线程的线程池的设计一般也是采用单例模式,这是由于线程池要方便对池中的线程进行控制。

  • 单例模式的实现

单例模式的创建方式主要分为懒汉式饿汉式两种,并在次基础衍生出更多实现方式:

1)饿汉式:类初始化时会立即创建该类单例对象,线程天生安全,调用效率高。

2)懒汉式:类初始化时,不会立即实例化该对象,而是在真正需要使用的时候才会创建该对象,具备懒加载功能。

3)静态内部方式:结合了懒汉式和饿汉式各自的优点,真正需要对象的时候才会加载,加载类是线程安全的。

public class Demo3 {

    public static class SingletonClassInstance {
        private static final Demo3 DEMO_3 = new Demo3();
    }

    // 方法没有同步
    public static Demo3 getInstance() {
        return SingletonClassInstance.DEMO_3;
    }
}

4)枚举单例:使用枚举实现单例模式,其优点是实现简单、调用效率高,枚举本身就是单例,由 JVM 从根本上提供保障,避免通过反射和反序列化的漏洞,而缺点是没有延迟加载。

public class Demo4 {

    public static Demo4 getInstance() {
        return Demo.INSTANCE.getInstance();
    }

    //定义枚举
	private static enum Demo {
		INSTANCE;
		// 枚举元素为单例
		private Demo4 demo4;

		private Demo() {
			demo4 = new Demo4();
		}

		public Demo4 getInstance() {
			return demo4;
		}
	}
}

5)双重检测锁方式:因为 JVM 重排序的原因,可能会初始化多次,不推荐使用。

public class Demo5 {

	private volatile static Demo5 demo5;

	public static Demo5 getInstance() {
		if (demo5 == null) {
			synchronized (Demo5.class) {
				if (demo5 == null) {
					demo5 = new Demo5();
				}
			}
		}
		return demo5;
	}
}

2.2 工厂模式

工厂模式提供了一种创建对象的最佳方式。在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。

  • 工厂模式的好处

1)工厂模式是我们最常用的实例化对象模式了,是用工厂方法代替new操作的一种模式。

2)利用工厂模式可以降低程序的耦合性,为后期的维护修改提供了很大的便利。

3)将选择实现类、创建对象统一管理和控制。从而将调用者跟我们的实现类解耦。

  • 工厂模式的分类

实现了创建者和调用者分离,工厂模式又可以分为简单工厂工厂方法以及抽象工厂三种模式。

1)简单工厂:用来生产同一等级结构中的任意产品。(不支持拓展增加产品)

2)工厂方法:用来生产同一等级结构中的固定产品。(支持拓展增加产品)

3)抽象工厂:用来生产不同产品族的全部产品。(不支持拓展增加产品;支持增加产品族)

2.3 建造者模式

建造者模式是将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的方式进行创建。

  • 建造者模式和工厂模式区别

工厂类模式是提供的是创建单个类的产品,而建造者模式则是将各种产品集中起来进行管理,更加关注零件装配,用来具有不同的属性的产品。

  • 建造者模式的应用

1)Java 语言中的 StringBuilder。

2.4 原型模式

原型设计模式简单来说就是克隆。原型表明了有一个样板实例,这个原型是可定制的。

原型模式多用于创建复杂的或者构造耗时的实例,因为这种情况下,复制一个已经存在的实例可使程序运行更高效。

  • 原型模式的使用场景

1)类初始化需要消化非常多的资源,这个资源包括数据、硬件资源等。这时我们就可以通过原型拷贝避免这些消耗。

2)通过 new 产生的一个对象需要非常繁琐的数据准备或者权限,这时可以使用原型模式。

3)一个对象需要提供给其他对象访问,而且各个调用者可能都需要修改其值时,可以考虑使用原型模式拷贝多个对象供调用者使用,即保护性拷贝。

3 结构型模式

3.1 代理模式

代理模式通过代理控制对象的访问,可以在这个对象调用方法之前、调用方法之后去处理,甚至添加新的功能。(AOP 的实现原理)

  • 代理模式的应用

Spring AOP、日志打印、异常处理、事务控制、权限控制等。

  • 代理模式的分类

1)静态代理:简单代理模式,是动态代理的理论基础,也是常见使用在代理模式。

2)JDK 动态代理:使用反射完成代理,需要有顶层接口才能使用,常见是Mybatis 的 mapper 文件。

3)cglib 动态代理:也是使用反射完成代理,使用字节码技术,可以直接代理类,有个缺点就是不能对 final 类进行继承。

3.2 外观模式

也被叫做门面模式,用于隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口。

4 行为型模式

4.1 策略模式

策略模式定义了一系列的算法或业务逻辑操作,并将每一个算法、逻辑、操作封装起来,而且使它们还可以相互替换。

4.2 模板方法模式

模板方法模式定义一个操作中的业务处理逻辑骨架(父类),而将一些步骤延迟到子类中。使得子类可以不改变一个操作的结构来重定义该操作逻辑的实现。

实现一些操作时,整体步骤很固定,但是其中一小部分需要改变,这时候可以使用模板方法模式,将容易变的部分抽象出来,供子类实现。

举个例子,去餐厅吃饭时,餐厅给我们提供了一个模板就是:看菜单,点菜,吃饭,付款,走人。这里的点菜和付款是不确定的,需要由子类来完成的,其他的则是一个模板。

4.3 观察者模式

观察者模式是一种行为性模型,又叫发布-订阅模式。其定义对象之间一种一对多的依赖关系,使得当一个对象改变状态,则所有依赖于它的对象都会得到通知并自动更新。

相关文章

暂无评论

暂无评论...