最新面试题2021年设计模式面试题及答案汇总
最新面试题2021年设计模式面试题及答案汇总
全部面试题答案,更新日期:01月30日,直接下载吧!
下载链接:高清500+份面试题资料及电子书,累计 10000+ 页大厂面试题 PDF
设计模式
题1:抽象工厂模式和原型模式有什么区别?
抽象工厂模式:通常由工厂方法模式来实现。但一个工厂中往往含有多个工厂方法生成一系列的产品。这个模式强调的是客户代码一次保证只使用一个系列的产品。当要切换为另一个系列的产品,换一个工厂类即可。
原型模式:工厂方法的最大缺点就是,对应一个继承体系的产品类,要有一个同样复杂的工厂类的继承体系。我们可以把工厂类中的工厂方法放到产品类自身之中吗?如果这样的话,就可以将两个继承体系为一个。这也就是原型模式的思想,原型模式中的工厂方法为clone,它会返回一个拷贝(可以是浅拷贝,也可以是深拷贝,由设计者决定)。为了保证用户代码中到时可以通过指针调用clone来动态绑定地生成所需的具体的类。这些原型对象必须事先构造好。
原型模式想对工厂方法模式的另一个好处是,拷贝的效率一般对构造的效率要高。
题2:Java 中三种代理模式有什么区别?
1、静态代理:简单代理模式,是动态代理的理论基础。常见使用在代理模式。
2、jdk动态代理:使用反射完成代理。需要有顶层接口才能使用,常见是mybatis的mapper文件是代理。
3、cglib动态代理:也是使用反射完成代理,可以直接代理类(jdk动态代理不行),使用字节码技术,不能对final类进行继承。(需要导入jar包)。
题3:装饰模式和代理模式有什么区别?
1、装饰器模式强调的是增强自身,在被装饰之后你能够在被增强的类上使用增强后的功能。增强后你还是你,只不过能力更强了而已;代理模式强调要让别人帮你去做一些本身与你业务没有太多关系的职责(记录日志、设置缓存)。代理模式是为了实现对象的控制,因为被代理的对象往往难以直接获得或者是其内部不想暴露出来。
2、装饰模式是以对客户端透明的方式扩展对象的功能,是继承方案的一个替代方案;代理模式则是给一个对象提供一个代理对象,并由代理对象来控制对原有对象的引用;
3、装饰模式是为装饰的对象增强功能;而代理模式对代理的对象施加控制,但不对对象本身的功能进行增强;
题4:Java 中什么是抽象工厂模式?
抽象工厂简单地说是工厂的工厂,抽象工厂可以创建具体工厂,由具体工厂来产生具体产品。
1)创建共用接口,代码如下:
package com.yoodb;
public interface Dinner{
public void eat();
}
2)创建实现类,代码如下:
package com.yoodb;
public class CatDinner implements Dinner{
@Override
public void eat() {
// TODO Auto-generated method stub
System.out.println("小猫来吃饭了!");
}
}
package com.yoodb;
public class DogDinner implements Dinner{
@Override
public void eat() {
// TODO Auto-generated method stub
System.out.println("小狗来吃饭了!");
}
}
3)创建接口,代码如下:
package com.yoodb;
public interface Provider {
public Sender produce();
}
4)创建两个工厂,代码如下:
package com.yoodb;
public class CatFactory implements Provider{
public Dinner produce(){
return new CatDinner();
}
}
package com.yoodb;
public class DogFactory implements Provider{
public Dinner produce(){
return new DogDinner();
}
}
5)main函数测试,代码如下:
package com.yoodb;
public class FactoryTest {
public static void main(String[] args) {
Provider factory = new DogFactory();
Dinner dinner = factory.produce();
dinner.eat();
}
}
题5:装饰模式和适配器模式有什么区别?
装饰模式:对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案,提供比继承更多的灵活性。使用原来被装饰的类的一个子类的实例,把客户端的调用委派到被装饰类。
适配器模式:把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口原因不匹配而无法一起工作的两个类能够一起工作。适配类可以根据参数返还一个合适的实例给客户端。
从定义上看装饰模式是对核心对象或者功能的扩展,适配器模式是把对象或者功能放到一个新对象中引用。举个例子,现在书城卖道德经的书,有线装版,有精装版,有日文版,有英文版,其中线装版和精装版就是装饰模式,日文版和英文版就是适配器模式,各种版本都是为迎合不同消费者的不同需求。为什么呢?因为线装版和精装版的道德经虽然包装不同,但内容相同,日文版和英文版就不同,这两个版本的内容就可能和原版的不同,文化差异嘛,翻译的内容虽来自道德经,但根据不同国家的文化,思维逻辑什么的就可能改变一些想法。
使用条件
装饰模式一般在下列情况使用:需要扩展一个类的功能或者给你个类增加附加责任;需要动态的给一个对象增加功能,这些功能可以再动态的撤销;需要增加有一些基本功能的排列组合而产生非常大量的功能,从而使得继承关系变得不现实。
适配器模式一般使用的情况包括:系统需要使用现有的类,但此类已经不符合系统的需要;
想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的的类一起工作。适配器模式在系统升级的时候使用的频率很高,对旧系统的一些功能方法在新系统中引用。
题6:Java 中原型模式有什么应用场景?
1、类初始化需要消化非常多的资源,这个资源包括数据、硬件资源等。这时我们就可以通过原型拷贝避免这些消耗。
2、通过new产生的一个对象需要非常繁琐的数据准备或者权限,这时可以使用原型模式。
3、一个对象需要提供给其他对象访问,而且各个调用者可能都需要修改其值时,可以考虑使用原型模式拷贝多个对象供调用者使用,即保护性拷贝。
题7:Java 中策略模式有什么应用场景?
策略模式是针对一组算法或逻辑,将每一个算法或逻辑封装到具有共同接口的独立的类中,从而使得它们之间可以相互替换。
实例1:根据不同会员等级打折力度不同的三种策略,初级会员,中级会员,高级会员(三种不同的计算)。
实例2:一个支付模块,要有微信支付、支付宝支付、银联支付等。
实例场景3:张三要到北方做买卖,走之前张三的父亲给仆人三个锦囊,说是危机关头按顺序依次拆开能解决相应的问题。场景中出现三个要素:妙计(具体策略类)、锦囊(环境事件类)、仆人(调用者)。
题8:Java 中代理模式如何实现静态代理?
如果代理类在程序运行前就已经存在,那么这种代理方式被成为静态代理,这种情况下的代理类一般都是在Java代码中定义的。
通常情况下, 静态代理中的代理类和委托类会实现同一接口或是派生自相同的父类。下面说一下如何实现静态代理模式。
接口(或抽象类),具体代码如下:
package com.yoodb;
public interface Business {
public void doAction();
}
此处是真正意义上实现业务逻辑的类,具体代码如下:
package com.yoodb;
public class BusinessImpl implements Business {
@Override
public void doAction() {
// TODO Auto-generated method stub
System.out.println("实现业务逻辑.");
}
}
自己并未实现业务逻辑接口,而是调用实现,具体代码如下:
package com.yoodb;
public class BusinessImplProxy implements Business{
private BusinessImpl impl;
@Override
public void doAction() {
// TODO Auto-generated method stub
if(impl == null){
impl = new BusinessImpl();
}
doBefore();
impl.doAction();
doAfter();
}
private void doBefore(){
System.out.println("调用目标对象前做相关操作");
}
private void doAfter(){
System.out.println("调用目标对象后做相关操作");
}
}
单元测试,具体代码如下:
package com.yoodb;
public class MainTest {
public static void main(String[] args) {
Business business = new BusinessImplProxy();
business.doAction();
}
}
运行之后结果如下:
调用目标对象前做相关操作
实现业务逻辑.
调用目标对象后做相关操作
题9:Java 中观察者模式有什么应用场景?
1、关联行为场景,需要注意的是,关联行为是可拆分的,而不是“组合”关系。事件多级触发场景。
2、跨系统的消息交换场景,如消息队列、事件总线的处理机制。
题10:微服务架构的六种常用设计模式是什么?
代理设计模式
聚合设计模式
链条设计模式
聚合链条设计模式
数据共享设计模式
异步消息设计模式