设计模式常见面试知识点总结(Java版)

设计模式

这篇总结主要是基于我设计模式系列的文章而形成的的。主要是把重要的知识点用自己的话说了一遍,可能会有一些错误,还望见谅和指点。谢谢

更多详细内容可以到我的cdsn博客上查看: https://blog.csdn.net/a724888

最后,如果想要更好地完成这部分内容的学习,建议大家还是去看一下原文。

创建型模式

创建型模式 创建型模式的作用就是创建对象,说到创建一个对象,最熟悉的就是 new 一个对象,然后 set 相关属性。但是,在很多场景下,我们需要给客户端提供更加友好的创建对象的方式,尤其是那种我们定义了类,但是需要提供给其他开发者用的时候。

单例

1.  `单例模式保证全局的单例类只有一个实例,这样的话使用的时候直接获取即可,比如数据库的一个连接,Spring里的bean,都可以是单例的。`

2.  

3.  `单例模式一般有5种写法。`

4.  

5.  `第一种是饿汉模式,先把单例进行实例化,获取的时候通过静态方法直接获取即可。缺点是类加载后就完成了类的实例化,浪费部分空间。`

6.  

7.  `第二种是饱汉模式,先把单例置为null,然后通过静态方法获取单例时再进行实例化,但是可能有多线程同时进行实例化,会出现并发问题。`

8.  

9.  `第三种是逐步改进的方法,一开始可以用synchronized关键字进行同步,但是开销太大,而后改成使用volatile修饰单例,然后通过一次检查判断单例是否已初始化,如果未初始化就使用synchronized代码块,再次检查单例防止在这期间被初始化,而后才真正进行初始化。`

10.  

11.  `第四种是使用静态内部类来实现,静态内部类只在被使用的时候才进行初始化,所以在内部类中进行单例的实例化,只有用到的时候才会运行实例化代码。然后外部类再通过静态方法返回静态内部类的单例即可。`

12.  

13.  `第五种是枚举类,枚举类的底层实现其实也是内部类。枚举类确保每个类对象在全局是唯一的。所以保证它是单例,这个方法是最简单的。`

工厂模式

1.  `简单工厂一般是用一个工厂创建多个类的实例。`

2.  

3.  `工厂模式一般是指一个工厂服务一个接口,为这个接口的实现类进行实例化`

4.  

5.  `抽象工厂模式是指一个工厂服务于一个产品族,一个产品族可能包含多个接口,接口又会包含多个实现类,通过一个工厂就可以把这些绑定在一起,非常方便。`

原型模式

1.  `一般通过一个实例进行克隆从而获得更多同一原型的实例。使用实例的clone方法即可完成。`

建造者模式

1.  `建造者模式中有一个概念叫做链式调用,链式调用为一个类的实例化提供便利,一般提供系列的方法进行实例化,实际上就是将set方法改造一下,将原本返回为空的set方法改为返回this实例,从而实现链式调用。`

2.  

3.  `建造者模式在此基础上加入了builder方法,提供给外部进行调用,同样使用链式调用来完成参数注入。`

结构型模式

1.  `结构型模式`

2.  

3.  `前面创建型模式介绍了创建对象的一些设计模式。`

4.  

5.  `这节介绍的结构型模式旨在通过改变代码结构来达到解耦的目的,使得我们的代码容易维护和扩展。`

桥接模式

1.  `有点复杂。建议参考原文`

适配器模式

1.  `适配器模式用于将两个不同的类进行适配。`

2.  

3.  `适配器模式和代理模式的异同`

4.  

5.  ` 比较这两种模式,其实是比较对象适配器模式和代理模式,在代码结构上,`

6.  ` 它们很相似,都需要一个具体的实现类的实例。`

7.  ` 但是它们的目的不一样,代理模式做的是增强原方法的活;`

8.  ` 适配器做的是适配的活,为的是提供“把鸡包装成鸭,然后当做鸭来使用”,`

9.  ` 而鸡和鸭它们之间原本没有继承关系。`

10.  

11.  ` 适配器模式可以分为类适配器,对象适配器等。`

12.  

13.  ` 类适配器通过继承父类就可以把自己适配成父类了。`

14.  ` 而对象适配器则需要把对象传入另一个对象的构造方法中,以便进行包装。`

享元模式

1.  `享元模式的核心在于享元工厂类,`

2.  

3.  `享元工厂类的作用在于提供一个用于存储享元对象的享元池,`

4.  

5.  `用户需要对象时,首先从享元池中获取,`

6.  

7.  `如果享元池中不存在,则创建一个新的享元对象返回给用户,`

8.  

9.  `在享元池中保存该新增对象。`

代理模式

1.  `我们发现没有,代理模式说白了就是做  “方法包装”  或做  “方法增强”。`

2.  

3.  ` 在面向切面编程中,算了还是不要吹捧这个名词了,在 AOP 中,`

4.  

5.  `其实就是动态代理的过程。比如  Spring  中,`

6.  `我们自己不定义代理类,但是  Spring  会帮我们动态来定义代理,`

7.  

8.  `然后把我们定义在  @Before、@After、@Around  中的代码逻辑动态添加到代理中。`

外观模式

1.  `外观模式一般封装具体的实现细节,为用户提供一个更加简单的接口。`

2.  

3.  `通过一个方法调用就可以获取需要的内容。`

组合模式

1.  `组合模式用于表示具有层次结构的数据,使得我们对单个对象和组合对象的访问具有一致性。`

2.  

3.  `直接看一个例子吧,每个员工都有姓名、部门、薪水这些属性,`

4.  

5.  `同时还有下属员工集合(虽然可能集合为空),`

6.  `而下属员工和自己的结构是一样的,`

7.  

8.  `也有姓名、部门这些属性,`

9.  `同时也有他们的下属员工集合。`

10.  

11.  `class  Employee  {`

12.  `private  String name;`

13.  `private  String dept;`

14.  `private  int salary;`

15.  `private  List subordinates;  // 下属`

16.  `}`

装饰者模式

装饰者

装饰者模式把每个增强类都继承最高级父类。然后需要功能增强时把类实例传入增强类即可,然后增强类在使用时就可以增强原有类的功能了。

和代理模式不同的是,装饰者模式每个装饰类都继承父类,并且可以进行多级封装。

行为型模式

1.  `行为型模式`

2.  

3.  `行为型模式关注的是各个类之间的相互作用,将职责划分清楚,使得我们的代码更加地清晰。`

策略模式

1.  `策略模式一般把一个策略作为一个类,并且在需要指定策略的时候传入实例,于是我们可以在需要使用算法的地方传入指定算法。`

命令模式

1.  `命令模式一般分为命令发起者,命令以及命令接受者三个角色。`

2.  

3.  `命令发起者在使用时需要注入命令实例。然后执行命令调用。`

4.  

5.  `命令调用实际上会调用命令接收者的方法进行实际调用。`

6.  

7.  `比如遥控器按钮相当于一条命令,点击按钮时命令运行,自动调用电视机提供的方法即可。`

模板方法模式

1.  `模板方法一般指提供了一个方法模板,并且其中有部分实现类和部分抽象类,并且规定了执行顺序。`

2.  

3.  `实现类是模板提供好的方法。而抽象类则需要用户自行实现。`

4.  

5.  `模板方法规定了一个模板中方法的执行顺序,非常适合一些开发框架,于是模板方法也广泛运用在开源框架中。`

观察者模式和事件监听机制

1.  `观察者模式一般用于订阅者和消息发布者之间的数据订阅。`

2.  

3.  `一般分为观察者和主题,观察者订阅主题,把实例注册到主题维护的观察者列表上。`

4.  

5.  `而主题更新数据时自动把数据推给观察者或者通知观察者数据已经更新。`

6.  

7.  `但是由于这样的方式消息推送耦合关系比较紧。并且很难在不打开数据的情况下知道数据类型是什么。`

8.  

9.  `知道后来为了使数据格式更加灵活,使用了事件和事件监听器的模式,事件包装的事件类型和事件数据,从主题和观察者中解耦。`

10.  

11.  `主题当事件发生时,触发该事件的所有监听器,把该事件通过监听器列表发给每个监听器,监听得到事件以后,首先根据自己支持处理的事件类型中找到对应的事件处理器,再用处理器处理对应事件。`

责任链模式

1.  `责任链通常需要先建立一个单向链表,然后调用方只需要调用头部节点就可以了,后面会自动流转下去。`

2.  

3.  `比如流程审批就是一个很好的例子,只要终端用户提交申请,根据申请的内容信息,自动建立一条责任链,然后就可以开始流转了。`

微信公众号

个人公众号:黄小斜

黄小斜是跨考软件工程的 985 硕士,自学 Java 两年,拿到了 BAT 等近十家大厂 offer,从技术小白成长为阿里工程师。

作者专注于 JAVA 后端技术栈,热衷于分享程序员干货、学习经验、求职心得和程序人生,目前黄小斜的CSDN博客有百万+访问量,知乎粉丝2W+,全网已有10W+读者。

黄小斜是一个斜杠青年,坚持学习和写作,相信终身学习的力量,希望和更多的程序员交朋友,一起进步和成长!

原创电子书:
关注公众号【黄小斜】后回复【原创电子书】即可领取我原创的电子书《菜鸟程序员修炼手册:从技术小白到阿里巴巴Java工程师》

程序员3T技术学习资源: 一些程序员学习技术的资源大礼包,关注公众号后,后台回复关键字 “资料” 即可免费无套路获取。

考研复习资料:
计算机考研大礼包,都是我自己考研复习时用的一些复习资料,包括公共课和专业的复习视频,这里也推荐给大家,关注公众号后,后台回复关键字 “考研” 即可免费获取。

技术公众号:Java技术江湖

如果大家想要实时关注我更新的文章以及分享的干货的话,可以关注我的公众号【Java技术江湖】一位阿里 Java 工程师的技术小站,作者黄小斜,专注 Java 相关技术:SSM、SpringBoot、MySQL、分布式、中间件、集群、Linux、网络、多线程,偶尔讲点Docker、ELK,同时也分享技术干货和学习经验,致力于Java全栈开发!

Java工程师必备学习资源: 一些Java工程师常用学习资源,关注公众号后,后台回复关键字 “Java” 即可免费无套路获取。

本文由博客一文多发平台 OpenWrite 发布!

原文地址:https://www.cnblogs.com/AliCoder/p/11700748.html

时间: 2024-10-01 11:08:04

设计模式常见面试知识点总结(Java版)的相关文章

设计模式常见面试知识点总结

设计模式 这篇总结主要是基于我设计模式系列的文章而形成的的.主要是把重要的知识点用自己的话说了一遍,可能会有一些错误,还望见谅和指点.谢谢 更多详细内容可以到我的cdsn博客上查看: https://blog.csdn.net/a724888 最后,如果想要更好地完成这部分内容的学习,建议大家还是去看一下原文. 创建型模式 创建型模式 创建型模式的作用就是创建对象,说到创建一个对象,最熟悉的就是 new 一个对象,然后 set 相关属性.但是,在很多场景下,我们需要给客户端提供更加友好的创建对象

Java集合类常见面试知识点总结

Java集合类学习总结 这篇总结是基于之前博客内容的一个整理和回顾. 这里先简单地总结一下,更多详细内容请参考我的专栏:深入浅出Java核心技术? https://blog.csdn.net/column/details/21930.html 里面有包括Java集合类在内的众多Java核心技术系列文章. 以下总结不保证全对,如有错误,还望能够指出,谢谢. 最后,如果想要更好地完成这部分内容的学习,建议大家还是去看一下原文. Colletion,iterator,comparable 一般认为Co

常见的排序算法--java版

个人总结的常见的排序算法 public class Sort { // 1.冒泡:稳定,最优O(n) 最差O(n^2) 平均O(n^2) private static void sort1(int[] arr) { for (int i = 0; i < arr.length; i++) { for (int j = 0; j < arr.length - 1; j++) { if (arr[j] > arr[j + 1]) { int tmp = arr[j]; arr[j] = ar

操作系统常见面试知识点

1.请分别简单说一说进程和线程以及它们的区别. 进程是具有一定功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源调度和分配的一个独立单位. 线程是进程的实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位. 一个进程可以有多个线程,多个线程也可以并发执行 2.线程同步的方式有哪些 互斥量:采用互斥对象机制,只有拥有互斥对象的线程才有访问公共资源的权限.因为互斥对象只有一个,所以可以保证公共资源不会被多个线程同时访问. 信号量:它允许同一时刻多个线程访问同一资源,但

好程序员Java教程分享Javamain常见面试问题

好程序员Java教程分享Javamain常见面试问题,Java程序员在参加面试的时候,在Javamain方面都会被问到哪些问题呢?为大家准备一些常见的Javamain的基础知识问题,帮助大家在面试前做好准备: 1.不用main方法如何定义一个类? 不行,没有main方法我们不能运行Java类. 在Java7之前,你可以通过使用静态初始化运行Java类.但是,从Java7开始就行不通了. 2.main()方法需要的参数不是字符串数组? 不是的,main()方法的参数必须是字符串数组. 但是,在引进

面试中关于Java中涉及到知识点(转)

本篇文章会对面试中常遇到的Java技术点进行全面深入的总结,帮助我们在面试中更加得心应手,不参加面试的同学也能够借此机会梳理一下自己的知识体系,进行查漏补缺. 1. Java中的原始数据类型都有哪些,它们的大小及对应的封装类是什么? (1)boolean boolean数据类型非true即false.这个数据类型表示1 bit的信息,但是它的大小并没有精确定义. <Java虚拟机规范>中如是说:“虽然定义了boolean这种数据类型,但是只对它提供了非常有限的支持.在Java虚拟机中没有任何供

Java 面试知识点解析(二)——高并发编程篇

前言: 在遨游了一番 Java Web 的世界之后,发现了自己的一些缺失,所以就着一篇深度好文:知名互联网公司校招 Java 开发岗面试知识点解析 ,来好好的对 Java 知识点进行复习和学习一番,大部分内容参照自这一篇文章,有一些自己补充的,也算是重新学习一下 Java 吧. 前序文章链接: Java 面试知识点解析(一)--基础知识篇 (一)高并发编程基础知识 这里涉及到一些基础的概念,我重新捧起了一下<实战 Java 高并发程序设计>这一本书,感觉到心潮澎湃,这或许就是笔者叙述功底扎实的

关于一些设计模式(面试小问题,Java篇)

今天在某公司(不透露了)写了一套Java面试题.有个题大概是这样的. Which design pattern used in Java.lang.Runtime? 就是说java.lang.Runtime里,用了什么设计模式 还有java.utils.collection里用了什么设计模式. 当时由于对这冷门知识了解的不够多,而且api也读的少,所以一时答不上来. 回到家搜了下. 答: Runtiome里 单例模式. 1)  每一个Java程序都有一个Runtime类的单一实例. 2)  通过

java异常常见面试问题

java异常常见面试问题 一.java异常的理解 异常主要是处理编译期不能捕获的错误.出现问题时能继续顺利执行下去,而不导致程序终止,确保程序的健壮性. 处理过程:产生异常状态时,如果当前的context不具备处理当前异常的能力,将在heap上new出来一个异常对象,停止当前的执行路线,把产生的异常对象抛给更高层的context. Throwable:异常类    Error:系统异常:不能恢复:Exception :普通异常:可恢复 利用try/catch/finally处理异常 什么时候使用