JAVA面试常见问题之设计模式篇
1、常见的设计模式
单例模式、工厂模式、建造模式、观察者模式、适配器模式、代理模式、装饰模式.
参考:https://www.cnblogs.com/cr330326/p/5627658.html
2、设计模式的六大原则及其含义
- 单一职责原则:一个类只负责一个功能领域中的相应职责,或者可以定义为:就一个类而言,应该只有一个引起它变化的原因。主要作用实现代码高内聚,低耦合。
- 开闭原则:一个软件实体应当对扩展开放,对修改关闭。即软件实体应尽量在不修改原有代码的情况下进行扩展。
- 里氏替换原则:所有引用基类(父类)的地方必须能透明地使用其子类的对象。里氏替换原则是实现开闭原则的方式之一
- 依赖倒置原则:抽象不应该依赖于细节,细节应当依赖于抽象。换言之,要针对接口编程,而不是针对实现编程。
- 接口隔离原则:使用多个专门的接口,而不使用单一的总接口,即客户端不应该依赖那些它不需要的接口。
- 迪米特法则:一个软件实体应当尽可能少地与其他实体发生相互作用。
参考:https://www.cnblogs.com/dolphin0520/p/3919839.html
3、常见的单例模式以及各种实现方式的优缺点,哪一种最好,手写常见的单利模式
常见模式及优缺点:
- 饿汉式:
- 优点:不用加锁可以确保对象的唯一性,线程安全。
- 缺点:初始化对象会浪费不必要的资源,未实现延迟加载。
- 懒汉式:
- 优点:实现了延时加载。
- 缺点:线程不安全,想实现线程安全,得加锁(synchronized),这样会浪费一些不必要的资源。
- 双重检测锁式(Double Check Lock--DCL):
- 优点:资源利用率高,效率高。
- 缺点:第一次加载稍慢,由于java处理器允许乱序执行,偶尔会失败。
- 静态内部式:
- 优点:第一次调用方法时才加载类,不仅保证线程安全还能保证对象的唯一,还延迟了单例的实例化
- 缺点:
推荐使用静态内部式
public class Singleton4 { private Singleton4() { } public Singleton4 getInstance() { return SingletonHolder.SINGLETON; } private static class SingletonHolder { private static final Singleton4 SINGLETON = new Singleton4(); } }
参考:https://blog.csdn.net/username987654/article/details/79067583
4、设计模式在实际场景的应用
单例:连接数据库,记录日志
5、Spring中用到了哪些设计模式
- 工厂模式:spring中的BeanFactory就是简单工厂模式的体现,根据传入一个唯一的标识来获得bean对象,但是否是在传入参数后创建还是传入参数前创建这个要根据具体情况来定。
- 代理模式:Spring的AOP就是代理模式的体现。
- 观察者模式:常用的地方是Listener的实现,spring中ApplicationListener就是观察者的体现。
- 策略模式:spring在实例化对象的时候使用到了。
- 工厂方法:Spring中的FactoryBean就是典型的工厂方法模式。
参考:https://www.cnblogs.com/hwaggLee/p/4510687.html
6、MyBatis中用到了哪些设计模式
- Builder模式,例如SqlSessionFactoryBuilder、XMLConfigBuilder、XMLMapperBuilder、XMLStatementBuilder、CacheBuilder;
- 工厂模式,例如SqlSessionFactory、ObjectFactory、MapperProxyFactory;
- 单例模式,例如ErrorContext和LogFactory;
- 代理模式,Mybatis实现的核心,比如MapperProxy、ConnectionLogger,用的jdk的动态代理;还有executor.loader包使用了cglib或者javassist达到延迟加载的效果;
- 组合模式,例如SqlNode和各个子类ChooseSqlNode等;
- 模板方法模式,例如BaseExecutor和SimpleExecutor,还有BaseTypeHandler和所有的子类例如IntegerTypeHandler;
- 适配器模式,例如Log的Mybatis接口和它对jdbc、log4j等各种日志框架的适配实现;
- 装饰者模式,例如Cache包中的cache.decorators子包中等各个装饰者的实现;
- 迭代器模式,例如迭代器模式PropertyTokenizer;
参考:https://www.cnblogs.com/shuchen007/p/9193179.html
7、动态代理
cglib,jdk
纸上得来终觉浅,绝知此事要躬行。