java设计模式中的一些面试题汇总
1. 请列举出在JDK中几个常用的设计模式?
- 单例模式:用来确保类只有一个实例。(
Spring的bean,枚举
)懒汉式:不在系统加载时就创建类的单例,而是在第一次使用实例的时候再创建。
饿汉式:在加载类的时候就会创建类的单例,并保存在类中。
- 工厂模式(简单工厂、抽象工厂):解耦代码。(
MyBatis中使用的比较多,事务模块和数据源模块都使用了工厂方法模式。
)简单工厂:一个工厂类来面向多个目标实现,但是目标增加,工厂类就需要修改。
抽象工厂:一个目标对应一个工厂类,如果目标实现较多,工厂实现类也会增多。
- 观察者模式:定义了对象之间的一对多的依赖,这样一来,当一个对象改变时,它的所有的依赖者都会收到通知并自动更新。(
发布-订阅模式:微博(微信公众号)账号的订阅
) - 装饰者模式:动态的给一个对象附加额外的功能,因此它也是子类化的一种替代方法。(
AOP
) - 适配器模式:常用于将一个新接口适配旧接口。
- 门面模式:为一组组件,接口,抽象或子系统提供简化的接口。(
SLFJ日志就是门面日志
) - 享元模式:使用缓存来减少对小对象的访问时间(
缓存
) - 代理模式:代理模式用于向较简单的对象代替创建复杂或耗时的对象。(
动态代理
) - 状态模式:允许您在运行时根据内部状态轻松更改对象的行为。(
订单状态
) - 策略模式:使用这个模式来将一组算法封装成一系列对象。通过调用这些对象可以灵活的改变程序的功能。(
常用于优化大量的if-else
) - 模板方法模式:让子类可以重写方法的一部分,而不是整个重写,你可以控制子类需要重写那些操作。(
业务代码中经常遇到有很多相同的部分,我们可以做一个抽象类,子类来实现差异化
)
2. 设计模式六大原则
- 开闭原则:对扩展开放,对修改关闭。即在不修改一个软件实体的基础上去扩展其他功能。
- 里氏代换原则:在软件系统中,一个可以接受基类对象的地方必然可以接受一个子类对象。
- 依赖倒转原则:针对于接口编程,依赖于抽象而不依赖于具体。
- 接口隔离原则:使用多个隔离的接口取代一个统一的接口。降低类与类之间的耦合度。
- 迪米特法则(最少知道原则):一个实体应当尽量少的与其他实体之间发生相互作用,使得系统功能模块相对独立。
- 合成复用原则:在系统中应该尽量多使用组合和聚合关联关系,尽量少使用甚至不使用继承关系。
3. J2ee常见设计模式,总共23种
- 创建型模式(工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式)
- 结构型模式(适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式)
- 行为型模式(策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式)
4. 什么是设计模式?你是否在你的代码里面使用过任何设计模式?
设计模式是世界上各种各样程序员用来解决特定设计问题的尝试和测试的方法,设计模式是代码可用性的延伸。
单例模式(枚举),享元模式(缓存),门面模式(SLFJ日志)
5. Java 编程为什么不允许从静态方法中访问非静态变量?
Java 中不能从静态上下文访问非静态数据只是因为非静态变量是跟具体的对象实例关联的,而静态的却没有和任何实例关联。
6. 在 Java语言 中,什么时候用重载,什么时候用重写?
如果你看到一个类的不同实现有着不同的方式来做同一件事,那么就应该用重写(overriding),而重载(overloading)是用不同的输入做同一件事。在 Java 中,重载的方法签名不同,而重写并不是。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。