最新面试题2021年常见设计模式面试题及答案汇总
最新面试题2021年常见设计模式面试题及答案汇总
全部面试题答案,更新日期:01月30日,直接下载吧!
下载链接:高清500+份面试题资料及电子书,累计 10000+ 页大厂面试题 PDF
设计模式
题1:Java 中外观模式有什么优势?
1)它对客户屏蔽子系统组件,因而减少了客户处理的对象的数目并使得子系统使用起来更加方便。
2)它实现了子系统与客户之间的松耦合关系,而子系统内部的功能组件往往是紧耦合的。松耦合关系使得子系统的组件变化不会影响到它的客户。Facade模式有助于建立层次结构系统,也有助于对对象之间的依赖关系分层。Facade模式可以消除复杂的循环依赖关系。
这一点在客户程序与子系统是分别实现的时候尤为重要。在大型软件系统中降低编译依赖性至关重要。在子系统类改变时,希望尽量减少重编译工作以节省时间。用Facade可以降低编译依赖性,限制重要系统中较小的变化所需的重编译工作。Facade模式同样也有利于简化系统在不同平台之间的移植过程,因为编译一个子系统一般不需要编译所有其他的子系统。
3)如果应用需要,它并不限制它们使用子系统类。因此你可以在系统易用性和通用性之间加以选择。
题2:Java 中单例模式有什么优缺点?
单例模式优点
1、在单例模式中,活动的单例只有一个实例,对单例类的所有实例化得到的都是相同的一个实例。这样就防止其它对象对自己的实例化,确保所有的对象都访问一个实例。
2、单例模式具有一定的伸缩性,类自己来控制实例化进程,类就在改变实例化进程上有相应的伸缩性。
3、提供了对唯一实例的受控访问。
4、由于在系统内存中只存在一个对象,因此可以节约系统资源,当需要频繁创建和销毁的对象时单例模式无疑可以提高系统的性能。
5、允许可变数目的实例。
6、避免对共享资源的多重占用。
单例模式缺点
1、不适用于变化的对象,如果同一类型的对象总是要在不同的用例场景发生变化,单例就会引起数据的错误,不能保存彼此的状态。
2、由于单利模式中没有抽象层,因此单例类的扩展有很大的困难。
3、单例类的职责过重,在一定程度上违背了“单一职责原则”。
4、滥用单例将带来一些负面问题,如为了节省资源将数据库连接池对象设计为的单例类,可能会导致共享连接池对象的程序过多而出现连接池溢出;如果实例化的对象长时间不被利用,系统会认为是垃圾而被回收,这将导致对象状态的丢失。
题3:微服务架构的六种常用设计模式是什么?
代理设计模式
聚合设计模式
链条设计模式
聚合链条设计模式
数据共享设计模式
异步消息设计模式
题4:Java 中模板方法模式有什么应用场景?
在很多框架中都有使用模板方法模式。
例如:数据库访问的封装、Junit单元测试、servlet中关于doGet/doPost方法的调用等等。
题5:Java 中为什么不允许从静态方法中访问非静态变量?
Java中不能从静态上下文访问非静态数据只是因为非静态变量是跟具体的对象实例关联的,而静态的却没有和任何实例关联。
题6:Java 中单例模式使用时有哪些注意事项?
1、使用时不能用反射模式创建单例,否则会实例化一个新的对象。
2、使用懒单例模式时注意线程安全问题。
3、饿单例模式和懒单例模式构造方法都是私有的,因而是不能被继承的,有些单例模式可以被继承(如登记式模式)。
题7:Java 中代理模式有几种分类?
Java中代理模式有3种分类:
1、静态代理(静态定义代理类)。
2、动态代理(动态生成代理类,也称为Jdk自带动态代理)。
3、Cglib 、javaassist(字节码操作库)。
题8:Java 中原型模式如何实现浅拷贝?
浅拷贝是指对值类型的成员变量进行值的复制,对引用类型的成员变量只复制引用,不复制引用的对象。
浅拷贝只负责克隆按值传递的数据(比如基本数据类型、String类型),而不复制它所引用的对象,换言之,所有的对其他对象的引用都仍然指向原来的对象。
1、实体类,具体代码如下:
package com.yoodb;
public class Prototype implements Cloneable{
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
protected Object clone() {
// TODO Auto-generated method stub
try {
return super.clone();
} catch (CloneNotSupportedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
}
2、测试方法,具体代码如下:
package com.yoodb;
public class TestMain {
public static void main(String[] args) {
Prototype pro = new Prototype();
pro.setName("欢迎收藏blog.yoodb.com");
Prototype prot = (Prototype) pro.clone();
prot.setName("欢迎收藏blog.yoodb.com");
System.out.println("original object:" + pro.getName());
System.out.println("cloned object:" + prot.getName());
}
}
3、运行结果如下:
original object:欢迎收藏blog.yoodb.com
cloned object:欢迎收藏blog.yoodb.com
题9:Java 中如何实现对象的适配器模式?
1、实现特殊功能类,代码如下:
package com.yoodb;
public class Adaptee {
public void specificRequest() {
System.out.println("具有特殊功能...");
}
}
2、标准接口,代码如下:
package com.yoodb;
public interface Target {
//标准接口
public void request();
}
3、普通功能实现类,代码如下:
package com.yoodb;
public class ConcreteTarget implements Target {
//具有普通功能
@Override
public void request() {
// TODO Auto-generated method stub
System.out.println("具有普通功能...");
}
}
4、适配器类直接实现标准接口,具体代码如下:
package com.yoodb;
public class Adapter implements Target{
private Adaptee adaptee;
@Override
public void request() {
// TODO Auto-generated method stub
this.adaptee.specificRequest();
}
public Adapter(Adaptee adaptee) {
super();
this.adaptee = adaptee;
}
}
5、测试函数,具体代码如下:
package com.yoodb;
public class ClientMain {
//测试函数
public static void main(String[] args) {
//普通功能
Target target = new ConcreteTarget();
target.request();
//特殊功能
Target adapter = new Adapter();
adapter.request();
}
}
6、测试结果如下:
具有普通功能...
具有特殊功能...
题10:Java 中什么是装饰模式?
装饰模式又名包装(Wrapper)模式,以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案。
装饰模式动态的给对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更灵活。
装饰模式的角色包含如下:
1)抽象构件(Component)角色:给出一个抽象接口,以规范准备接收附加责任的对象。
2)具体构件(ConcreteComponent)角色:定义一个将要接收附加责任的类。
3)装饰(Decorator)角色:持有一个构件(Component)对象的实例,并定义一个与抽象构件接口一致的接口。
4)具体装饰(ConcreteDecorator)角色:负责给构件对象“贴上”附加的责任。