8.6.4.1请实现一个线程安全的单例模式。

1      public class MailListReader {

2          private static MailListReader reader = null;

3          private MailListReader(){}//构造函数私有

4           public static MailListReader getInstance() {

5              if(singleton == null){

6                 synchronized (Singleton.class){

7                   if(singleton == null){

8                            singleton = new Singleton();

9                    }

10                  }

11               }

12               return reader;

13          }

14          //省略提供邮件列表的方法

15      }

8.6.4.2工厂模式有哪几类?使用工厂模式最主要的好处是什么?你在项目里是怎么使用工厂模式的?

工厂模式(Factory Method)是用来向使用者屏蔽创建对象的细节。之前我们在讲SAX解析XML文件时,已经用到过工厂模式,当时我们是通过如下代码用SAXParserFacotry这个工厂对象来创建用于解析的parse对象,代码如下所示。

1      SAXParserFactory factory = SAXParserFactory.newInstance();

2      SAXParser parser = factory.newSAXParser();

作为使用者,我们只要能得到parser对象进行后继的解析动作,至于parser对象是如何创建的,我们不需要,也不应管。如果不用工厂模式,那么我们还得亲自关注如何创建parser对象,比如得考虑创建时传入的参数,以及是否改用“池”的方式来创建从而提升效率。

这样亲力亲为的后果是,会让使用和创建parser对象的代码耦合度很高,这样一旦创建parser的方法发生改变,比如日后需要传入不同的参数,那么使用parser的代码也需要对应修改。

大家别以为增加修改量没什么大不了,如果我们在某个模块里修改了代码,哪怕这个修改点再小,也得经过完整的测试才能把这段代码放入生产环境,这是需要工作量的。如果我们把“使用”和“创建”对象放在一个模块里,那么“使用”部分的代码也得测试(虽然没改),但我们通过了工厂模式分离了两者,那么只需要测“创建”模块,就可以减少工作量了。

更多内容请看本书8.2.2到8.2.4部分

8.6.4.3 你在平时的开发过程中用过哪些设计模式?

在本书的第8章里,已经列了关于观察者等模式的说辞,下面,我们进一步给出讲述设计模式(乃至设计思想)的说辞。

我们在8.5.3讲述里氏替换原则时,已经给出了“在面试中不露痕迹引出设计模式话题“的一些方法,这里我们将给出展示自己 设计模式能力的方法,大家一定得在面试前,根据这里给出的四个关键说明点做好充分的准备,临时准备一定是达不到好的效果的。

说明点一,通过案例场景引出你准备说的模式。

这里可以从你简历中的最近做的一个项目里提炼一个例子,比如就拿观察者模式里的“牛人发文章邮件通知粉丝”为例,大家可以先描述下项目的场景(也就是要解决的实际问题)。

说明点二,引出待使用的设计模式。

这里需要说出你引用的场景和设计模式的切合点,比如这里需求的关键点在于“状态改变后需通知依赖对象”,这和观察者模式的适用场景一致。

说明点三,结合项目实际,通过代码等方式说明设计模式。

比如这里可以通过项目里的相关类,以及类之间的继承和调用关系来说明你是怎么实现观察者模式的,比如通知类、文章管理类和调用类分别是如何实现的,同时说明它们之间的调用关系。

说明点四,结合设计原则,说出自己对设计模式的理解。

最好再说下自己对设计模式的理解,否则你的层次可能只停留在“会用设计模式解决实际问题”(当然这也已经不错了),而不是“具有一定的架构设计和优化能力”(这是更好的评价)。

这里给出一些“出彩”的语句给大家参考。

1 其实我们使用设计模式的根本原因是提升项目的可维护性。(大家都知道,但你得说)

2 我们在解决这个(你举的例子)问题时,除了用到设计模式之外,还会尽量注意设计模式背后蕴含的思想,比如在设计观察者类时,我们不在其中放其它种类的业务代码,这符合单一职责模式,而且我们定义类之间的关系时,会遵循“合成复用原则“,只在具有从属关系的类之间才使用继承,否则会使用聚合或组合。(最好再通过实例说明,如果可以,再结合项目实例引入其它的原则)

3 在项目里,我们经常会收到需求变更,当我们引入设计模式(或原则)后,发现能让项目拥抱修改。

随后举个例子说明,比如之前的代码没有很好遵循单一职责模式,在一些重要方法里放了多种逻辑,在几次修改后,我们痛定思痛决定重构代码,重构后的方法里只包含了一类逻辑,之后再修改的时候,我们的测试工作量就能大幅度降低了。

4 我现在感觉是,设计模式不仅能给出具体的解决方案,还能提供优化系统架构的思路,所以在项目里,我们一般不会只用其中某个,而会根据一些原则来优化我们的代码。

比如在定义模块和方法时,根据单一职责原则,我们尽量只在其中引入一类逻辑,在定义子类方法时,根据里氏替换原则,如果子类要扩展功能,我们是会在其中添加新的方法,而不是覆盖父类的非抽象方法,又如,根据合成复用原则,我们只把具有逻辑从属关系的类定义成父子类,否则是用组合或聚合来定义类之间的耦合关系。

总之,大家如果能在面试中按上述四个“说明点”层层递进地展示自己设计模式方面的能力,就一定能得到“精通设计模式”乃至“有一定的系统架构设计和优化经验”之类的评价,这类评语在同等条件下能很大程度地帮助大家成功地在竞争者中脱颖而出,从而得到心仪的岗位。

Java核心技术及面试指南 设计模式部分的面试题总结以及答案的更多相关文章

  1. Java核心技术及面试指南 JDBC部分的面试题总结以及答案

    5.5.1 你最近的项目里用到的是哪个数据?或你用过哪些数据库?或你对哪个数据库最熟悉? 通过这个问题,我们将会确认候选人是否在项目里用过数据库或JDBC. 5.5.2 你有没有建过表?或修改表里的字 ...

  2. Java核心技术及面试指南 集合部分总的面试题归纳以及答案

    3.6.1ArrayList和LinkedList有什么差别?在哪种场景里应当用ArrayList(或LinkedList)? 大家如果学过数据结构,这个问题不难回答:前者是基于数组,数组比较擅长索引 ...

  3. Java核心技术及面试指南 IO部分的面试题归纳以及答案

    4.6.1 java中有几种类型的流? Java中的流分为两种,一种是字节流,另一种是字符流,分别由四个抽象类来表示(每种流包括输入和输出两种所以一共四个):InputStream,OutputStr ...

  4. Java核心技术及面试指南 面向对象部分的面试题总结以及答案

    问题2.7.1,开放性问题,说一下你对面向对象思想的了解. 要点1,先说基础概念,比如面向对象思想包括封装.继承.多态,然后说些语法,比如可以通过extends继承类.通过implement来实现接口 ...

  5. Java核心技术及面试指南 多线程部分的基本面试题总结以及答案

    7.1.5 (1) 如果某个类已经继承(extends)了一个类,那么让这个类具有多线程的特性? implements runnable类或通过线程池 7.1.5  (2)启动一个线程是用run()还 ...

  6. Java核心技术及面试指南 异常部分的面试题归纳以及答案

    4.2.4.1 throw和throws有什么差别?异常(Exception)和错误(Error)有什么差别? throw语句表示抛出异常,由方法体内的语句处理.throws语句用在方法声明后面,表示 ...

  7. Java核心技术及面试指南 数据库方面的面试题归纳以及总结

    5.1.7.1 事务的四大特性是什么? ⑴ 原子性(Atomicity) 原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚. ⑵ 一致性(Consistency) 一致性是指事务必须使数据库 ...

  8. Java核心技术及面试指南的视频讲解和代码下载位置

    都是百度云盘,均无密码 代码下载位置: https://pan.baidu.com/s/1I44ob0vygMxvmj2BoNioAQ 视频讲解位置: https://pan.baidu.com/s/ ...

  9. Java核心技术及面试指南:视频列表

    如下是本书相关内容的视频列表,会动态更新 第一章 1 视频1.1  JDK和JRE和JVM的区别,安装Java开发环境    1.1.1  第2页 2 视频1.2  编写第一个HelloWorld程序 ...

随机推荐

  1. session的几种模式

    https://www.cnblogs.com/panchunting/archive/2012/06/25/ASPNET_Session_Mode.html token的生成和应用 session和 ...

  2. 小程序即时聊天(仅页面功能,未接websocket)

    我们都知道小程序是不能直接操作dom的,所以做即时通讯聊天功能的时候也就不能像之前做的一样:点击发送的时候,拼接一个节点到页面上.话不多说,以下是效果和代码: -------------------- ...

  3. 大白话讲解Promise

    去年6月份, ES2015正式发布(也就是ES6,ES6是它的乳名),其中Promise被列为正式规范.作为ES6中最重要的特性之一,我们有必要掌握并理解透彻.本文将由浅到深,讲解Promise的基本 ...

  4. Oracle ctl模版

    将txt数据装载到数据库 数据无”” LOAD DATA CHARACTER-SET ZHS16GBK truncate into table a FIELDS TERMINATED BY ‘,’ T ...

  5. SpringMVC之拦截器的的配置和使用

    拦截器与过滤器的区别:拦截器只能拦截controller的请求,过滤器可以过滤所有请求 (1)实现HandlerInterceptor接口 在执行控制器中的方法之前执行preHandle()中的方法 ...

  6. teamviewer quicksupport 插件(下载)

    teamviewer quicksupport 插件(下载) teamviewer是一款远程控制软件(免费,比较好的); teamviewer quicksupport是一款支持手机可以被远程控制软件 ...

  7. CSS grayscale滤镜+SVG使图片变黑白实例页面

    http:/CSS 地址:/www.runoob.com/cssref/css3-pr-filter.html CSS代码: .gray { -webkit-filter: grayscale(%); ...

  8. VS中自定义类模版

    以下为vs2017 专业版,安装目录在D盘 安装路径: D:\Program Files (x86)\Microsoft Visual Studio\\Professional\Common7\IDE ...

  9. SPA 单页面应用程序。

    看到这个问题,先说下自己的理解到的程度,再去参考做修正,争取这一次弄懂搞清楚 自己的理解: 单页面应用程序,解决浏览器获取数据刷新页面的尴尬,通过ajax请求获取数据达到异步更新视图的按钮,原理的实现 ...

  10. 显存充足,但是却出现CUDA error:out of memory错误

    之前一开始以为是cuda和cudnn安装错误导致的,所以重装了,但是后来发现重装也出错了. 后来重装后的用了一会也出现了问题.确定其实是Tensorflow和pytorch冲突导致的,因为我发现当我同 ...