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

设计模式

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

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

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

创建型模式

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

单例

  1. 单例模式保证全局的单例类只有一个实例,这样的话使用的时候直接获取即可,比如数据库的一个连接,Spring里的bean,都可以是单例的。
  2. 单例模式一般有5种写法。
  3. 第一种是饿汉模式,先把单例进行实例化,获取的时候通过静态方法直接获取即可。缺点是类加载后就完成了类的实例化,浪费部分空间。
  4. 第二种是饱汉模式,先把单例置为null,然后通过静态方法获取单例时再进行实例化,但是可能有多线程同时进行实例化,会出现并发问题。
  5. 第三种是逐步改进的方法,一开始可以用synchronized关键字进行同步,但是开销太大,而后改成使用volatile修饰单例,然后通过一次检查判断单例是否已初始化,如果未初始化就使用synchronized代码块,再次检查单例防止在这期间被初始化,而后才真正进行初始化。
  6. 第四种是使用静态内部类来实现,静态内部类只在被使用的时候才进行初始化,所以在内部类中进行单例的实例化,只有用到的时候才会运行实例化代码。然后外部类再通过静态方法返回静态内部类的单例即可。
  7. 第五种是枚举类,枚举类的底层实现其实也是内部类。枚举类确保每个类对象在全局是唯一的。所以保证它是单例,这个方法是最简单的。

工厂模式

  1. 简单工厂一般是用一个工厂创建多个类的实例。
  2. 工厂模式一般是指一个工厂服务一个接口,为这个接口的实现类进行实例化
  3. 抽象工厂模式是指一个工厂服务于一个产品族,一个产品族可能包含多个接口,接口又会包含多个实现类,通过一个工厂就可以把这些绑定在一起,非常方便。

原型模式

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

建造者模式

  1. 建造者模式中有一个概念叫做链式调用,链式调用为一个类的实例化提供便利,一般提供系列的方法进行实例化,实际上就是将set方法改造一下,将原本返回为空的set方法改为返回this实例,从而实现链式调用。
  2. 建造者模式在此基础上加入了builder方法,提供给外部进行调用,同样使用链式调用来完成参数注入。

结构型模式

  1. 结构型模式
  2. 前面创建型模式介绍了创建对象的一些设计模式。
  3. 这节介绍的结构型模式旨在通过改变代码结构来达到解耦的目的,使得我们的代码容易维护和扩展。

桥接模式

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

适配器模式

  1. 适配器模式用于将两个不同的类进行适配。
  2. 适配器模式和代理模式的异同
  3. 比较这两种模式,其实是比较对象适配器模式和代理模式,在代码结构上,
  4. 它们很相似,都需要一个具体的实现类的实例。
  5. 但是它们的目的不一样,代理模式做的是增强原方法的活;
  6. 适配器做的是适配的活,为的是提供“把鸡包装成鸭,然后当做鸭来使用”,
  7. 而鸡和鸭它们之间原本没有继承关系。
  8. 适配器模式可以分为类适配器,对象适配器等。
  9. 类适配器通过继承父类就可以把自己适配成父类了。
  10. 而对象适配器则需要把对象传入另一个对象的构造方法中,以便进行包装。

享元模式

  1. 享元模式的核心在于享元工厂类,
  2. 享元工厂类的作用在于提供一个用于存储享元对象的享元池,
  3. 用户需要对象时,首先从享元池中获取,
  4. 如果享元池中不存在,则创建一个新的享元对象返回给用户,
  5. 在享元池中保存该新增对象。

代理模式

  1. 我们发现没有,代理模式说白了就是做 “方法包装” 或做 “方法增强”。
  2. 在面向切面编程中,算了还是不要吹捧这个名词了,在 AOP 中,
  3. 其实就是动态代理的过程。比如 Spring 中,
  4. 我们自己不定义代理类,但是 Spring 会帮我们动态来定义代理,
  5. 然后把我们定义在 @Before、@After、@Around 中的代码逻辑动态添加到代理中。

外观模式

  1. 外观模式一般封装具体的实现细节,为用户提供一个更加简单的接口。
  2. 通过一个方法调用就可以获取需要的内容。

组合模式

  1. 组合模式用于表示具有层次结构的数据,使得我们对单个对象和组合对象的访问具有一致性。
  2. 直接看一个例子吧,每个员工都有姓名、部门、薪水这些属性,
  3. 同时还有下属员工集合(虽然可能集合为空),
  4. 而下属员工和自己的结构是一样的,
  5. 也有姓名、部门这些属性,
  6. 同时也有他们的下属员工集合。
  7. class Employee {
  8. private String name;
  9. private String dept;
  10. private int salary;
  11. private List<Employee> subordinates; // 下属
  12. }

装饰者模式

装饰者

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

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

行为型模式

  1. 行为型模式
  2. 行为型模×××之间的相互作用,将职责划分清楚,使得我们的代码更加地清晰。

策略模式

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

命令模式

  1. 命令模式一般分为命令发起者,命令以及命令接受者三个角色。
  2. 命令发起者在使用时需要注入命令实例。然后执行命令调用。
  3. 命令调用实际上会调用命令接收者的方法进行实际调用。
  4. 比如遥控器按钮相当于一条命令,点击按钮时命令运行,自动调用电视机提供的方法即可。

模板方法模式

  1. 模板方法一般指提供了一个方法模板,并且其中有部分实现类和部分抽象类,并且规定了执行顺序。
  2. 实现类是模板提供好的方法。而抽象类则需要用户自行实现。
  3. 模板方法规定了一个模板中方法的执行顺序,非常适合一些开发框架,于是模板方法也广泛运用在开源框架中。

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

  1. 观察者模式一般用于订阅者和消息发布者之间的数据订阅。
  2. 一般分为观察者和主题,观察者订阅主题,把实例注册到主题维护的观察者列表上。
  3. 而主题更新数据时自动把数据推给观察者或者通知观察者数据已经更新。
  4. 但是由于这样的方式消息推送耦合关系比较紧。并且很难在不打开数据的情况下知道数据类型是什么。
  5. 知道后来为了使数据格式更加灵活,使用了事件和事件监听器的模式,事件包装的事件类型和事件数据,从主题和观察者中解耦。
  6. 主题当事件发生时,触发该事件的所有监听器,把该事件通过监听器列表发给每个监听器,监听得到事件以后,首先根据自己支持处理的事件类型中找到对应的事件处理器,再用处理器处理对应事件。

责任链模式

  1. 责任链通常需要先建立一个单向链表,然后调用方只需要调用头部节点就可以了,后面会自动流转下去。
  2. 比如流程审批就是一个很好的例子,只要终端用户提交申请,根据申请的内容信息,自动建立一条责任链,然后就可以开始流转了。×××黄小斜是跨考软件工程的 985 硕士,自学 Java 两年,拿到了 BAT 等近十家大厂 offer,从技术小白成长为阿里工程师。

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

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

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

程序员3T技术学习资源: 一些程序员学习技术的资源大礼×××关键字 “资料” 即可免费无套路获取。

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

×××术江湖

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

Java工程师必备学习资源: 一些Java工程师常用学习资×××关键字 “Java” 即可免费无套路获取。×××

原文地址:https://blog.51cto.com/14156136/2449554

时间: 2024-08-04 13:10:07

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

设计模式常见面试知识点总结(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

操作系统常见面试知识点

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

面试--知识点2

1.1 JAVA基础 面向对象和面向过程的区别 Java 语言有哪些特点 关于 JVM JDK 和 JRE 最详细通俗的解答 Oracle JDK 和 OpenJDK 的对比 List 和 Set 的区别 什么是 Java 程序的主类 应用程序和小程序的主类有何不同 Java 应用程序与小程序之间有那些差别 字符型常量和字符串常量的区别 Java 面向对象编程三大特性: 封装 继承 多态 构造器 Constructor 是否可被 override Arrays.sort 实现原理和 Collec

Android面试知识点(转)

该文所有问题转自:http://www.cnblogs.com/hpboy/p/3307371.html 一.算法,数据结构 1.排序算法 2.查找算法 3.二叉树 4.广度,深度算法: 二.java基础 1.集合Collection,List,Map等常用方法,特点,关系: 2.线程的同步,中断方式有几种,线程池,线程状态,常用的方法比较,比如wait,sleep等: 3.反射机制 4.IO包的使用,运用了什么设计模式 5.设计模式,常用的设计模式,运用场景: 6.内存管理,引用的种类: 7.

L--前端开发面试知识点(HTML相关)

简介 前端开发面试知识点大纲: HTML&CSS: 对web标准的理解.浏览器内核的差异.兼容性.hack.css基本功:布局.盒子模型.选择器优先级及使用.HTML5.CSS3.移动端适应. javascript: 数据类型.面向对象.继承.闭包.插件.作用域.跨域.原型链.模块化.自定义事件.内存泄露.事件机制.异步装载回调.模板引擎.nodejs.JSON.ajax 其他:HTTP.安全.正则.优化.重构.响应式.移动端.团队协作.可维护.SEO.UED.架构.职业生涯 1.请你谈谈Coo

Android开发面试经——6.常见面试官提问Android题②(更新中...)

版权声明:本文为寻梦-finddreams原创文章,请关注:http://blog.csdn.net/finddreams 关注finddreams博客:http://blog.csdn.net/finddreams/article/details/44560061 1.HttpURLConnection和HttpClient他们各自的优缺点是什么? HttpUrlConnection 在 2.3 以前的版本是有 bug 的,所以之前的版本推荐使用 HttpClient,但是 google 现在

Java---常用基础面试知识点

综合网上的一点资源,给大家整理了一些Java常用的基础面试知识点,希望能帮助到刚开始学习或正在学习的学员. 1.抽象 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面.抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节.抽象包括两个方面,一是过程抽象,二是数据抽象. 2.继承 继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法. 对象的一个新类可以从现有的类中派生,这个过程称为类继承.新类继 承了原始类的特性,新

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

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