设计模式应该这样学

以下文章来源于公众号“程序员求职之路”

设计模式是人们在面对同类型软件工程设计问题所总结出的一些有用的经验。

模式不是代码,而是某类问题的通用设计解决方案。这篇文章以面试问答的角度带你了解设计模式这块知识。


1、请列举出在 JDK 中几个常用的设计模式?

①单例模式(Singleton pattern)用于 Runtime,Calendar 和其他的一些类中;

②工厂模式(Factory pattern)被用于各种不可变的类如Boolean,像Boolean.valueOf;

③观察者模式(Observer pattern)被用于 Swing 和很多的事件监听中;

④装饰器设计模式(Decorator design pattern)被用于多个 Java IO 类中。


2、什么是设计模式 ? 

设计模式是世界上各种各样程序员用来解决特定设计问题的尝试和测试的方法。设计模式是代码可用性的延伸。


3、Java 中什么叫单例设计模式?请用 Java 写出线程安全的单例模式

单例模式重点在于在整个系统上共享一些创建时较耗资源的对象。整个应用中只维护一个特定类实例,它被所有组件共同使用。

Java.lang.Runtime 是单例模式的经典例子。从 Java5开始你可以使用枚举(enum)来实现线程安全的单例。


4、在Java中,什么叫观察者设计模式(observer design pattern)?

观察者模式是定义对象间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新。

观察者模式又叫做发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-监听器(Source/Listener)模式或从属者(Dependents)模式。


5、使用工厂模式最主要的好处是什么?在哪里使用?

工厂模式的最大好处是增加了创建对象时的封装层次。如果你使用工厂来创建对象,之后你可以使用更高级和更高性能的实现来替换原始的产品实现或类,这不需要在调用层做任何修改。 


6、什么是适配器模式?

适配器模式是将一个类的接口变成客户端所期望的另一种接口,从而使原本因接口不匹配而无法一起工作的两个类能够在一起工作。

优点:

可以让两个没有关联的类一起运行,起着中间转换的作用;

灵活性好,不会破坏原有的系统。

缺点:

过多地使用适配器,容易使代码结构混乱,如明明看到调用的是 A 接口,内部调用的却是 B 接口的实现。

以生活中的例子来说,比如有一个充电器是 MicroUSB 接口,而手机充电口却是 TypeC 的,这个时候就需要一个把 MicroUSB 转换成 TypeC 的适配器。


7、在Java中,为什么不允许从静态方法中访问非静态变量?

Java 中不能从静态上下文访问非静态数据只是因为非静态变量是跟具体的 对象实例关联的,而静态的却没有和任何实例关联。


8、Spring 中都使用了哪些设计模式?

Spring 框架使用的设计模式如下。

代理模式:在 AOP 中有使用

单例模式:bean 默认是单例模式

模板方法模式:jdbcTemplate

工厂模式:BeanFactory

观察者模式:Spring 事件驱动模型就是观察者模式很经典的一个应用,比如,ContextStartedEvent 就是 ApplicationContext 启动后触发的事件

适配器模式:Spring MVC 中也是用到了适配器模式适配 Controller


9、在 Java 中,什么时候用重载,什么时候用重写?

如果你看到一个类的不同实现有着不同的方式来做同一件事,那么就应该用 34 重写(overriding),而重载(overloading)是用不同的输入做同一件事。在 Java 中,重载的方法签名不同,而重写并不是。 


10IO 使用了什么设计模式

IO 使用了适配器模式和装饰器模式。

适配器模式:由于 InputStream 是字节流不能享受到字符流读取字符那么便捷的功能,借助 InputStreamReader 将其转为 Reader 子类,因而可以拥有便捷操作文本文件方法;

装饰器模式:将 InputStream 字节流包装为其他流的过程就是装饰器模式,比如,包装为 FileInputStream、ByteArrayInputStream、PipedInputStream 等。


懂你所想、知你所需,后台回复「面试题库」,做足功课为自己的面试交出满意答卷吧。


更多内容也请关注

程序员求职之路

一个为程序员量身定做的求职公众号

给你贴心有效的大厂面试真题

面试干货、职业发展干货、简历模版

你可能感兴趣的:(设计模式应该这样学)