2019秋招:460道Java后端面试高频题答案版【模块七:设计模式】

640

设 计 模 式

写在前面

1. 设计模式虽然在面试中没有计算机网络协议和操作系统那么重要,但是也是会被经常问到的。设计模式除了在 JDK 和一些框架中被大量使用到外,在日常开发中也是很常见的。举个我实习遇到的例子:之前实习做过订单详情页,详情页有很多的按钮,比如:取消订单、再次购买、查看物流等等,我们就可以创建一个 ButtonFactory,然后根据不同的业务类型及订单状态进行页面按钮的组装工作。这样就避免了每种业务类型都需要创建一个按钮组装类的复杂工作,代码也显得清爽很多。
2. 这里我推荐两本本书,《大话设计模式》和《设计模式之禅》,这两本书写的都非常通俗易懂,看起来也非常快,所以还是比较推荐大家看一看的。

640?wx_fmt=png

3. 我之前学习设计模式的时候还看了刘伟博客中关于设计模式的讲解,当时自己将其博客中主要内容总结成了笔记,还有自己的代码实现。现在云盘中分享给大家,需要的自取:

链接:
https://pan.baidu.com/s/1EOn4tzFqAbtdnlW5gCW5hg
提取码:eay4

640?wx_fmt=png

4. 现在分享一个个人认为快速搞定设计模式的方法:设计模式不比操作系统和网络协议必须没有任何知识点遗漏。如果你现在时间很充足,当然建议 23 种设计模式都认真的学习下。那么如果你现在时间很紧张了,其实可以看看面经中面试官常问到的设计模式其实也就那么几种:单例、工厂、适配器、装饰器、代理、组合、策略、模板等。你可以选取其中几种认真了解下,往自己的项目中套一套。个人感觉并不需要 23 种都熟记于心,只要能说出来自己用过的几种就行。 
5. 对于设计模式而言,我认为在面试中经常遇到的问题有以下几种:
(1)简单说下你了解的设计模式;
(2)你写代码过程中使用过设计模式吗?我觉得这块是可以加分的点,以为如果你会考虑使用设计模式去优化代码,那么说明你是有自己设计思考的,会让面试官觉得你并不是实现功能型选手;
(3)举例说明 JDK 源码或者 Spring/Mybatis 框架中使用到的设计模式,这是在考察你有没有看过相应模块的源码; 
(4)可能会让你对比两种相近设计模式的区别;
(5)再有就是有时候笔试会出一些设计模式的选择题,都是概念性的,理解即可。

1、说下你知道的设计模式有哪些?

下面 3 种类型中各挑几个常见的或者你用过的说就可以了。

640?wx_fmt=png

2、工厂方法模式和抽象工厂模式有什么区别?
  • 工厂方法模式:

一个抽象产品类,可以派生出多个具体产品类。 一个抽象工厂类,可以派生出多个具体工厂类。每个具体工厂类只能创建一个具体产品类的实例。  

  • 抽象工厂模式:

多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。 一个抽象工厂类,可以派生出多个具体工厂类。每个具体工厂类可以创建多个具体产品类的实例。        

  • 区别:

工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。

3、JDK 中用到了哪些设计模式?
几乎每一种设计模式都被用到了 JDK 的源码中,下面列举一些常见的:
  • 抽象工厂模式
1. javax.xml.parsers.DocumentBuilderFactory#newInstance()	
2. javax.xml.transform.TransformerFactory#newInstance()
  • 建造者模式
1. java.lang.StringBuilder#append() 	
2. java.lang.StringBuffer#append()
  • 原型模式
1. java.lang.Object#clone()
  • 适配器模式
1. java.util.Arrays#asList()	
2. java.util.Collections#list()
  • 装饰器模式
1. IO 流的子类	
2. java.util.Collections#synchronizedXXX()
  • 享元模式
1. java.lang.Integer#valueOf(int)
  • 代理模式
1. java.lang.reflect.Proxy	
2. javax.inject.Inject
  • 责任链模式
1. java.util.logging.Logger#log()	
2. javax.servlet.Filter#doFilter()
......
4、Spring 中用到了哪些设计模式?
1. 单例设计模式 : Spring 中的 Bean 默认都是单例的;
2. 代理设计模式 : Spring AOP 功能的实现;
3. 工厂设计模式 : Spring 使用工厂模式通过 BeanFactory、ApplicationContext 创建 Bean 对象;
4. 模板方法模式 : Spring 中 jdbcTemplate、hibernateTemplate 等以 Template 结尾的对数据库操作的类,它们就使用到了模板模式;
5. 装饰器设计模式 : 我们的项目需要连接多个数据库,而且不同的客户在每次访问中根据需要会去访问不同的数据库。这种模式让我们可以根据客户的需求能够动态切换不同的数据源;
6. 观察者模式:Spring 事件驱动模型就是观察者模式很经典的一个应用;
7. 适配器模式:Spring AOP 的增强或通知(Advice)使用到了适配器模式、SpringMVC 中也是用到了适配器模式适配 Controller。

5、设计模式六大原则是什么?

1. 单一职责原则:一个方法 一个类只负责一个职责,各个职责的程序改动,不影响其它程序。  
2. 开闭原则:对扩展开放,对修改关闭。即在不修改一个软件实体的基础上去扩展其他功能。
3. 里氏代换原则:在软件系统中,一个可以接受基类对象的地方必然可以接受一个子类对象。
4. 依赖倒转原则:针对于接口编程,依赖于抽象而不依赖于具体。
5. 接口隔离原则:使用多个隔离的接口取代一个统一的接口。降低类与类之间的耦合度。
6. 迪米特原则:一个实体应当尽量少的与其他实体之间发生相互作用,使得系统功能模块相对独立。

7. 单例模式的优缺点?

  • 优点:

由于在系统内存中只存在一个对象,因此可以节约系统资源,对于一些需要频繁创建和销毁的对象单例模式无疑可以提高系统的性能。

  • 缺点:

由于单例模式中没有抽象层,因此单例类的扩展有很大的困难。滥用单例将带来一些负面问题,如为了节省资源将数据库连接池对象设计为的单例类,可能会导致共享连接池对象的程序过多而出现连接池溢出;如果实例化的对象长时间不被利用,系统会认为是垃圾而被回收,这将导致对象状态的丢失。

8、请手写一下单例模式?

  • 1. 懒汉式:用到时再去创建

public class Singleton {	
    private static  Singleton instance;	
    private Singleton(){};	
 	
    public static synchronized Singleton getInstance(){	
        if(instance == null){	
            instance = new Singleton();	
        }	
        return instance;	
    }	
}
  • 2. 饿汉式:初始化时即创建,用到时直接返回

public class Singleton {	
    private static  Singleton instance = new Singleton();	
    private Singleton(){};	
 	
    public static Singleton getInstance(){	
        return instance;	
    }	
}
  • 3. 静态内部类【推荐】

public class Singleton {	
    private static class SingletonHolder{	
        private static final Singleton INSTTANCE = new Singleton();	
    }	
 	
    private Singleton(){};	
 	
    public static final Singleton getInstance(){	
        return SingletonHolder.INSTTANCE;	
    }	
}
  • 4. 双重校验锁【推荐】

public class Singleton {	
    private volatile static Singleton singleton; 	
    private Singleton(){};	
    	
    public static Singleton getSingleton(){	
        if(singleton == null){	
            synchronized(Singleton.class){	
                if(singleton == null){	
                    singleton = new Singleton();	
                }	
            }	
        }	
        return singleton;	
    } 	
}

9、树形文件目录采用的是哪种设计模式?

采用的是组合模式。树形结构在软件中随处可见,例如:操作系统中的目录结构、应用软件中的菜单、办公系统中的公司组织结构等等,如何运用面向对象的方式来处理这种树形结构是组合模式需要解决的问题,组合模式通过一种巧妙的设计方案使得用户可以一致性地处理整个树形结构或者树形结构的一部分,也可以一致性地处理树形结构中的叶子节点(不包含子节点的节点)和容器节点(包含子节点的节点)。

640?wx_fmt=png


640?wx_fmt=png
您点的“在看”就是对我最大的鼓励
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值