目录

前言

1.什么是设计模式

2.为什么要学习设计模式

3.设计模式分类

4.设计模式的六大原则

5.单例模式

5.1 什么是单例

5.2 哪些地方用到了单例模式

5.3 单例优缺点

5.4 单例模式使用注意事项:

5.5 单例防止反射漏洞攻击

5.6 如何选择单例创建方式

5.7 单例创建方式

6.工厂模式

6.1 什么是工厂模式

6.2 工厂模式好处

6.3 为什么要学习工厂设计模式

6.4 Spring开发中的工厂设计模式

6.5 工厂模式分类

7.代理模式

7.1 什么是代理模式

7.2 代理模式应用场景

7.3 代理的分类

7.4 三种代理的区别

7.5 用代码演示三种代理

8.建造者模式

8.1 什么是建造者模式

8.2 建造者模式的使用场景

8.3 代码案例

9.模板方法模式

9.1 什么是模板方法

9.2 什么时候使用模板方法

9.3 实际开发中应用场景哪里用到了模板方法

9.4 现实生活中的模板方法

9.5 代码实现模板方法模式

10.外观模式

10.1 什么是外观模式

10.2 外观模式例子

11.原型模式

11.1 什么是原型模式

11.2 原型模式的应用场景

11.3 原型模式的使用方式

11.4 代码演示

12.策略模式

12.1 什么是策略模式

12.2 策略模式应用场景

12.3 策略模式的优点和缺点

12.4 代码演示

13.观察者模式

13.1 什么是观察者模式

13.2 模式的职责

13.3 观察者模式应用场景

13.4 代码实现观察者模式

最后

前言

设计模式在日常的工作中,是非常重要的一项技能,使用设计模式可以重构整体架构代码、提交代码复用性、扩展性、减少代码冗余问题。这是每个 Java 工程师必备的技能!今日小编主要讲的是设计模式之一的策略模式,小编会通过案例和面试题,带你一步步由浅入深对策略模式进行解析。

小编分享的这份金三银四Java后端开发面试总结包含了JavaOOP、Java集合容器、Java异常、并发编程、Java反射、Java序列化、JVM、Redis、Spring MVC、MyBatis、MySQL数据库、消息中间件MQ、Dubbo、Linux、ZooKeeper、 分布式&数据结构与算法等26个专题技术点,都是小编在各个大厂总结出来的面试真题,已经有很多粉丝靠这份PDF拿下众多大厂的offer,今天在这里总结分享给到大家!【持续更新中!】

完整版Java面试题地址:2021最新面试题合集集锦。

序号 专题 内容 链接地址
1 中间件 【金三银四】Java中间件面试题(2021最新版) https://blog.csdn.net/SQY0809/article/details/114002362
2 微服务 【金三银四】Java微服务面试题(2021最新版) https://blog.csdn.net/SQY0809/article/details/113923549
3 并发编程 【金三银四】Java并发编程面试题(2021最新版) https://blog.csdn.net/SQY0809/article/details/113895576
4  Java基础 【金三银四】Java基础知识面试题(2021最新版) https://blog.csdn.net/SQY0809/article/details/115146056
5 Spring Boot 【金三银四】Spring Boot面试题(2021最新版) https://blog.csdn.net/SQY0809/article/details/115186811
6  Redis 【金三银四】Redis面试题(2021最新版) https://blog.csdn.net/SQY0809/article/details/115188010
7  Spring MVC 【金三银四】Spring MVC面试题(2021最新版) https://blog.csdn.net/SQY0809/article/details/115220638
8 Spring Cloud 【金三银四】Spring Cloud面试题(2021最新版) https://blog.csdn.net/SQY0809/article/details/115220987
9 MySQL优化 【金三银四】MySQL优化面试题(2021最新版) https://blog.csdn.net/SQY0809/article/details/115254620
10 JVM 【金三银四】JVM性能调优面试题(2021最新版) https://blog.csdn.net/SQY0809/article/details/115283079
11 Linux 【金三银四】Linux面试题(2021最新版) https://blog.csdn.net/SQY0809/article/details/115283583
12 Mybatis 【金三银四】Mybatis面试题(2021最新版) https://blog.csdn.net/SQY0809/article/details/115285732
13 网络编程 【金三银四】TCP,UDP,Socket,Http网络编程面试题(2021最新版) https://blog.csdn.net/SQY0809/article/details/115464896
14 设计模式 【金三银四】设计模式面试题(2021最新版) https://blog.csdn.net/SQY0809/article/details/115466449
15 大数据 金三银四】大数据面试题100道(2021最新版) https://blog.csdn.net/SQY0809/article/details/115484939
16 Tomcat 【金三银四】Tomcat面试题(2021最新版) https://blog.csdn.net/SQY0809/article/details/115486648
17 多线程 【金三银四】多线程面试题(2021最新版) https://blog.csdn.net/SQY0809/article/details/115487212
18 Nginx 【金三银四】Nginx_BIO_NIO_AIO面试题(2021最新版) https://blog.csdn.net/SQY0809/article/details/115488446
19 memcache 【金三银四】memcache面试题(2021最新版) https://blog.csdn.net/SQY0809/article/details/115494213
20 java异常 【金三银四】java异常面试题(2021最新版) https://blog.csdn.net/SQY0809/article/details/115530401
21 Java虚拟机 【金三银四】Java虚拟机面试题(2021最新版) https://blog.csdn.net/SQY0809/article/details/115532365
22 Java集合 【金三银四】Java集合面试题(2021最新版) https://blog.csdn.net/SQY0809/article/details/115599284
23 Git常用命令 【金三银四】Git常用命令(2021最新版) https://blog.csdn.net/SQY0809/article/details/115602390
24 Elasticsearch 【金三银四】Elasticsearch面试题(2021最新版) https://blog.csdn.net/SQY0809/article/details/115604293
25 Dubbo 【金三银四】Dubbo面试题(2021最新版) https://blog.csdn.net/SQY0809/article/details/115605560

1.什么是设计模式

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

2.为什么要学习设计模式

  • 看懂源代码:如果你不懂设计模式去看Jdk、Spring、SpringMVC、IO等等等等的源码,你会很迷茫,你会寸步难行
  • 看看前辈的代码:你去个公司难道都是新项目让你接手?很有可能是接盘的,前辈的开发难道不用设计模式?
  • 编写自己的理想中的好代码:我个人反正是这样的,对于我自己开发的项目我会很认真,我对他比对我女朋友还好,把项目当成自己的儿子一样

3.设计模式分类

4.设计模式的六大原则

  • 开放封闭原则(Open Close Principle)

  • 里氏代换原则(Liskov Substitution Principle)

  • 依赖倒转原则(Dependence Inversion Principle)

  • 接口隔离原则(Interface Segregation Principle)

  • 迪米特法则(最少知道原则)(Demeter Principle)

  • 单一职责原则(Principle of single responsibility)

5.单例模式

5.1 什么是单例

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

5.2 哪些地方用到了单例模式

1. 网站的计数器,一般也是采用单例模式实现,否则难以同步。

2. 应用程序的日志应用,一般都是单例模式实现,只有一个实例去操作才好,否则内容不好追加显示。

3. 多线程的线程池的设计一般也是采用单例模式,因为线程池要方便对池中的线程进行控制

4. Windows的(任务管理器)就是很典型的单例模式,他不能打开俩个

5. windows的(回收站)也是典型的单例应用。在整个系统运行过程中,回收站只维护一个实例。

5.3 单例优缺点

5.4 单例模式使用注意事项:

1. 使用时不能用反射模式创建单例,否则会实例化一个新的对象

2. 使用懒单例模式时注意线程安全问题

3. 饿单例模式和懒单例模式构造方法都是私有的,因而是不能被继承的,有些单例模式可以被继承(如登记式模式)

5.5 单例防止反射漏洞攻击

private static boolean flag = false;
private Singleton() {
if (flag == false) {
flag = !flag;
} else {
throw new RuntimeException("单例模式被侵犯!");
}
}
public static void main(String[] args) {
}

5.6 如何选择单例创建方式

如果不需要延迟加载单例,可以使用枚举或者饿汉式,相对来说枚举性好于饿汉式。 如果需要延 迟加载,可以使用静态内部类或者懒汉式,相对来说静态内部类好于懒韩式。 最好使用饿汉式

5.7 单例创建方式

1.饿汉式

1. 饿汉式:类初始化时,会立即加载该对象,线程天生安全,调用效率高。

package com.lijie;
//饿汉式
public class Demo1 {
// 类初始化时,会立即加载该对象,线程安全,调用效率高
private static Demo1 demo1 = new Demo1();
private Demo1() {
System.out.println("私有Demo1构造参数初始化");
}
public static Demo1 getInstance() {
return demo1;
}
public static void main(String[] args) {
Demo1 s1 = Demo1.getInstance();
Demo1 s2 = Demo1.getInstance();
System.out.println(s1 == s2);
}
}

6.工厂模式

6.1 什么是工厂模式

它提供了一种创建对象的最佳方式。在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。实现了创建者和调用者分离,工厂模式分为简单工厂、工厂方法、抽象工厂模式

6.2 工厂模式好处

  • 工厂模式是我们最常用的实例化对象模式了,是用工厂方法代替new操作的一种模式。
  • 利用工厂模式可以降低程序的耦合性,为后期的维护修改提供了很大的便利。
  • 将选择实现类、创建对象统一管理和控制。从而将调用者跟我们的实现类解耦。

6.3 为什么要学习工厂设计模式

不知道你们面试题问到过源码没有,你知道Spring的源码吗,MyBatis的源码吗,等等等 如果你想学习很多框架的源码,或者你想自己开发自己的框架,就必须先掌握设计模式(工厂设计模式用的是非常非常广泛的)

6.4 Spring开发中的工厂设计模式

6.5 工厂模式分类

7.代理模式

7.1 什么是代理模式

  • 通过代理控制对象的访问,可以在这个对象调用方法之前、调用方法之后去处理/添加新的功能。(也就是AO的P微实现)
  • 代理在原有代码乃至原业务流程都不修改的情况下,直接在业务流程中切入新代码,增加新功能,这也和Spring的(面向切面编程)很相似

7.2 代理模式应用场景

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

7.3 代理的分类

  • 静态代理(静态定义代理类)
  • 动态代理(动态生成代理类,也称为Jdk自带动态代理)
  • Cglib 、javaassist(字节码操作库)

7.4 三种代理的区别

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

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

3. cglib动态代理:也是使用反射完成代理,可以直接代理类(jdk动态代理不行),使用字节码技术,不能对 fifinal类进行继承。(需要导入jar包)

7.5 用代码演示三种代理

7.5.1静态代理

什么是静态代理

由程序员创建或工具生成代理类的源码,再编译代理类。所谓静态也就是在程序运行前就已经存在代理类的字节码文件,代理类和委托类的关系在运行前就确定了。

8.建造者模式

8.1 什么是建造者模式

  • 建造者模式:是将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的方 式进行创建。
  • 工厂类模式是提供的是创建单个类的产品
  • 而建造者模式则是将各种产品集中起来进行管理,用来具有不同的属性的产品

8.2 建造者模式的使用场景

8.3 代码案例

9.模板方法模式

9.1 什么是模板方法

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

9.2 什么时候使用模板方法

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

9.3 实际开发中应用场景哪里用到了模板方法

  • 其实很多框架中都有用到了模板方法模式
  • 例如:数据库访问的封装、Junit单元测试、servlet中关于doGet/doPost方法的调用等等

9.4 现实生活中的模板方法

9.5 代码实现模板方法模式

10.外观模式

10.1 什么是外观模式

  • 外观模式:也叫门面模式,隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口。
  • 它向现有的系统添加一个接口,用这一个接口来隐藏实际的系统的复杂性。
  • 使用外观模式,他外部看起来就是一个接口,其实他的内部有很多复杂的接口已经被实现

10.2 外观模式例子

11.原型模式

11.1 什么是原型模式

  • 原型设计模式简单来说就是克隆
  • 原型表明了有一个样板实例,这个原型是可定制的。原型模式多用于创建复杂的或者构造耗时的实 例,因为这种情况下,复制一个已经存在的实例可使程序运行更高效。

11.2 原型模式的应用场景

11.3 原型模式的使用方式

11.4 代码演示

12.策略模式

12.1 什么是策略模式

  • 定义了一系列的算法 或 逻辑 或 相同意义的操作,并将每一个算法、逻辑、操作封装起来,而且使它们还可以相互替换。(其实策略模式Java中用的非常非常广泛)
  • 我觉得主要是为了 简化 if...else 所带来的复杂和难以维护

12.2 策略模式应用场景

12.3 策略模式的优点和缺点

优点:

1、算法可以自由切换。

2、避免使用多重条件判断。

3、扩展性非常良好。

缺点:

1、策略类会增多。

2、所有策略类都需要对外暴露。

12.4 代码演示

模拟支付模块有微信支付、支付宝支付、银联支付

1. 定义抽象的公共方法

13.观察者模式

13.1 什么是观察者模式

  • 先讲什么是行为性模型,行为型模式关注的是系统中对象之间的相互交互,解决系统在运行时对象之间的相互通信和协作,进一步明确对象的职责。
  • 观察者模式,是一种行为性模型,又叫发布-订阅模式,他定义对象之间一种一对多的依赖关系,使得当一个对象改变状态,则所有依赖于它的对象都会得到通知并自动更新。

13.2 模式的职责

观察者模式主要用于1对N的通知。当一个对象的状态变化时,他需要及时告知一系列对象,令他们做出相应。

实现有两种方式:

1. 推:每次都会把通知以广播的方式发送给所有观察者,所有的观察者只能被动接收。

2. 拉:观察者只要知道有情况即可,至于什么时候获取内容,获取什么内容,都可以自主决定。

13.3 观察者模式应用场景

1. 关联行为场景,需要注意的是,关联行为是可拆分的,而不是“组合”关系。事件多级触发场景。

2. 跨系统的消息交换场景,如消息队列、事件总线的处理机制。

13.4 代码实现观察者模式

面试题答案解析完整文档:【设计模式面试题【附答案解析】】

最后

小编分享的文章到这里就结束了,整理不易,欢迎大家一起交流,喜欢小编分享的文章记得关注我点赞哟,感谢支持!

【金三银四】设计模式面试题(2021最新版)相关推荐

  1. 2022金三银四前端面试题预告

    2022金三银四前端面试题预告 马上就到了面试季了,今天整理了一下前端常见的一些面试题.虽说面试的时候造火箭,需要你背好八股文,不过很多基础还是应该掌握的,就算不面试,也应该多看一些基础,内功深厚了, ...

  2. 金三银四前端面试题准备

    HTTP HTTP 状态码? RFC 规定 HTTP 的状态码为三位数,被分为五类: 1xx :表示目前是协议处理的中间状态,还需要后续操作. 2xx :表示请求成功. 3xx : 重定向,表示要完成 ...

  3. 金三银四Java面试题及答案整理(2023最新版) 持续更新

    作为一名优秀的程序员,技术面试是不可避免的一个环节,一般技术面试官都会通过自己的方式去考察程序员的技术功底与基础理论知识. 如果你参加过一些大厂面试,肯定会遇到一些这样的问题: 1.看你项目都用的框架 ...

  4. 【金三银四】Java中间件面试题(2021最新版)

    目录 前言 Zookeeper 1. ZooKeeper 是什么? 2. ZooKeeper 提供了什么? 3.Zookeeper 文件系统 4. ZAB 协议? 5. 四种类型的数据节点 Znode ...

  5. 【金三银四】多线程面试题(2021最新版)

    目录 前言 1.多线程有什么用? 2.线程和进程的区别是什么? 3.Java 实现线程有哪几种方式? 4.启动线程方法 start()和 run()有什么区别? 5.怎么终止一个线程?如何优雅地终止线 ...

  6. 【金三银四】Tomcat面试题(2021最新版)

    目录 前言 1.Tomcat的缺省端口是多少,怎么修改? 2.tomcat 有哪几种Connector 运行模式(优化)? 3.Tomcat有几种部署方式? 4.tomcat容器是如何创建servle ...

  7. 【金三银四】Java集合面试题(2021最新版)

    目录 前言 一.集合容器概述 1. 什么是集合 2. 集合的特点 3. 集合和数组的区别 4. 使用集合框架的好处 5. 常用的集合类有哪些? 6. List,Set,Map三者的区别? 7. 集合框 ...

  8. 【金三银四】Spring Boot面试题(2021最新版)

    目录 前言 1. 什么是SpringBoot? 2. 为什么要用SpringBoot 3. SpringBoot与SpringCloud 区别 4. Spring Boot 有哪些优点? 5. Spr ...

  9. 【建议收藏】2021年中高级Android大厂面试秘籍,为你保驾护航金三银四,直通大厂

    一眨眼又到年底了,每到这个时候,我们都会慢慢反思,这一年都做了什么?有什么进步?年初的计划都实现了吗?明年年初有跳槽的底气了吗? 况且2020年我们经历了新冠疫情的洗礼,很多程序员都经历了失业,找工作 ...

最新文章

  1. Hadoop运行模式 之 本地运行模式
  2. Servlet 3.0 新特性详解
  3. 10个可以简化开发过程的MySQL工具
  4. nest 架构_如何与其他人分享您的Nest Cam Feed
  5. idea代码补全声明代码_用了这么多年idea,竟然不知道这些代码补全功能
  6. java volatile关键字的作用_java volatile关键字作用及使用场景详解
  7. SQLServer 语句相关
  8. Visual Studio 2015打开ASP.NET MVC的View提示“Object reference not set to an instance of an object“错误的解决方案
  9. 机器学习算法——GBDT
  10. java编程比赛_[阶段一]java基础编程比赛
  11. COSCon'20 Apache Roadshow- China 精彩收官!|会场精彩回顾篇
  12. 云洲无人船:驶向水上智能时代
  13. 360快传号,会成为下一个自媒体风口吗?
  14. 用HTML和css写的界面适应手机界面小结
  15. Flask入门(4):CBV和FBV
  16. LeetCode刷题框架总结
  17. Pnp即插即用设备驱动 自动安装程序 C C++实现
  18. 如何分析公众号后台数据?
  19. c51停车场车位管理系统
  20. 梦幻西游玩家最多的服务器,梦幻西游:第54次合服计划公布了,这两个服务器的玩家有福了...

热门文章

  1. 解决win10笔记本电脑开机要黑屏一段时间才显示锁屏界面的方案
  2. 0基础该如何快速入门python?全写在这篇学习攻略里了
  3. 支付宝大改版:打造全球最大数字生活开放平台
  4. 三折页设计尺寸的制作要素宣传册平面印刷
  5. 面向对象——五大基本原则
  6. 互相关的simulink
  7. php msgpack 扩展,ubuntu 上给PHP安装扩展 Msgpack 和 Yar
  8. 献给半夜加班到深夜的女程序员
  9. 苏州Uber优步司机奖励政策(4月21日)
  10. 网站常用主流网站数据库介绍