1 Star 0 Fork 31

阿明 / Ebooks

forked from Java精选 / Ebooks 
加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
2021年最新版设计模式面试题汇总附答案.md 14.68 KB
一键复制 编辑 原始数据 按行查看 历史

2021年最新版设计模式面试题汇总附答案

全部面试题答案,更新日期:01月30日,直接下载吧!

下载链接:高清500+份面试题资料及电子书,累计 10000+ 页大厂面试题 PDF

设计模式

题1:Java 中工厂方法模式有什么应用场景?

在以下情况下,适用于工厂方法模式:

1)当一个类不知道它所必须创建的对象的类的时候。

2)当一个类希望由它的子类来指定它所创建的对象的时候。

3)当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候。

题2:Java 中什么是解释器模式?

解释器模式是类的行为模式。给定一个语言之后,解释器模式可以定义出其文法的一种表示,并同时提供一个解释器。客户端可以使用这个解释器来解释这个语言中的句子。

该模式涉及角色如下:

1)抽象表达式(Expression)角色:声明一个所有的具体表达式角色都需要实现的抽象接口。这个接口主要是一个interpret()方法,称做解释操作。

2)终结符表达式(Terminal Expression)角色:实现了抽象表达式角色所要求的接口,主要是一个interpret()方法;文法中的每一个终结符都有一个具体终结表达式与之相对应。比如有一个简单的公式R=R1+R2,在里面R1和R2就是终结符,对应的解析R1和R2的解释器就是终结符表达式。

3)非终结符表达式(Nonterminal Expression)角色:文法中的每一条规则都需要一个具体的非终结符表达式,非终结符表达式一般是文法中的运算符或者其他关键字,比如公式R=R1+R2中,“+"就是非终结符,解析“+”的解释器就是一个非终结符表达式。

4)环境(Context)角色:这个角色的任务一般是用来存放文法中各个终结符所对应的具体值,比如R=R1+R2,我们给R1赋值100,给R2赋值200。这些信息需要存放到环境角色中,很多情况下我们使用Map来充当环境角色就足够了。

题3:Java 中单例模式有什么优缺点?

单例模式优点

1、在单例模式中,活动的单例只有一个实例,对单例类的所有实例化得到的都是相同的一个实例。这样就防止其它对象对自己的实例化,确保所有的对象都访问一个实例。

2、单例模式具有一定的伸缩性,类自己来控制实例化进程,类就在改变实例化进程上有相应的伸缩性。

3、提供了对唯一实例的受控访问。

4、由于在系统内存中只存在一个对象,因此可以节约系统资源,当需要频繁创建和销毁的对象时单例模式无疑可以提高系统的性能。

5、允许可变数目的实例。

6、避免对共享资源的多重占用。

单例模式缺点

1、不适用于变化的对象,如果同一类型的对象总是要在不同的用例场景发生变化,单例就会引起数据的错误,不能保存彼此的状态。

2、由于单利模式中没有抽象层,因此单例类的扩展有很大的困难。

3、单例类的职责过重,在一定程度上违背了“单一职责原则”。

4、滥用单例将带来一些负面问题,如为了节省资源将数据库连接池对象设计为的单例类,可能会导致共享连接池对象的程序过多而出现连接池溢出;如果实例化的对象长时间不被利用,系统会认为是垃圾而被回收,这将导致对象状态的丢失。

题4:Java 中模板方法模式有什么应用场景?

在很多框架中都有使用模板方法模式。

例如:数据库访问的封装、Junit单元测试、servlet中关于doGet/doPost方法的调用等等。

题5:什么是高内聚、低耦合?

内聚关注模块内部的元素结合程度,耦合关注模块之间的依赖程度。

1)内聚性

又称块内联系。指模块的功能强度的度量,即一个模块内部各个元素彼此结合的紧密程度的度量。若一个模块内各元素(语名之间、程序段之间)联系的越紧密,则它的内聚性就越高。

所谓高内聚是指一个软件模块是由相关性很强的代码组成,只负责一项任务,也就是常说的单一责任原则。

2)耦合性

也称块间联系。指软件系统结构中各模块间相互联系紧密程度的一种度量。模块之间联系越紧密,其耦合性就越强,模块的独立性则越差。模块间耦合高低取决于模块间接口的复杂性、调用的方式及传递的信息。

对于低耦合,粗浅的理解是:一个完整的系统,模块与模块之间,尽可能的使其独立存在。也就是说,让每个模块,尽可能的独立完成某个特定的子功能。模块与模块之间的接口,尽量的少而简单。如果某两个模块间的关系比较复杂的话,最好首先考虑进一步的模块划分。这样有利于修改和组合。

题6:设计模式的六大原则是什么?

1)开闭原则(Open Close Principle)

开闭原则就是说对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果。所以一句话概括就是:为了使程序的扩展性好,易于维护和升级。想要达到这样的效果,我们需要使用接口和抽象类,后面的具体设计中我们会提到这点。

2)里氏代换原则(Liskov Substitution Principle)

里氏代换原则(Liskov Substitution Principle LSP)面向对象设计的基本原则之一。 里氏代换原则中说,任何基类可以出现的地方,子类一定可以出现。LSP是继承复用的基石,只有当衍生类可以替换掉基类,软件单位的功能不受到影响时,基类才能真正被复用,而衍生类也能够在基类的基础上增加新的行为。里氏代换原则是对“开-闭”原则的补充。实现“开-闭”原则的关键步骤就是抽象化。而基类与子类的继承关系就是抽象化的具体实现,所以里氏代换原则是对实现抽象化的具体步骤的规范。

3)依赖倒转原则(Dependence Inversion Principle)

这个是开闭原则的基础,具体内容:真对接口编程,依赖于抽象而不依赖于具体。

4)接口隔离原则(Interface Segregation Principle)

大概意思是指使用多个隔离的接口,比使用单个接口要好。还是一个降低类之间的耦合度的意思,从这儿我们看出,其实设计模式就是一个软件的设计思想,从大型软件架构出发,为了升级和维护方便。所以上文中多次出现:降低依赖,降低耦合。

5)迪米特法则(最少知道原则)(Demeter Principle)

为什么叫最少知道原则,就是说:一个实体应当尽量少的与其他实体之间发生相互作用,使得系统功能模块相对独立。

6)合成复用原则(Composite Reuse Principle)

原则是尽量使用合成/聚合的方式,而不是使用继承。

题7: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 extends Adaptee implements Target{
    @Override
    public void request() {
        // TODO Auto-generated method stub
        super.specificRequest();
    }
     
}

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、测试结果如下:

具有普通功能...
具有特殊功能...

题8:Java 中外观模式有什么优势?

1)它对客户屏蔽子系统组件,因而减少了客户处理的对象的数目并使得子系统使用起来更加方便。

2)它实现了子系统与客户之间的松耦合关系,而子系统内部的功能组件往往是紧耦合的。松耦合关系使得子系统的组件变化不会影响到它的客户。Facade模式有助于建立层次结构系统,也有助于对对象之间的依赖关系分层。Facade模式可以消除复杂的循环依赖关系。

这一点在客户程序与子系统是分别实现的时候尤为重要。在大型软件系统中降低编译依赖性至关重要。在子系统类改变时,希望尽量减少重编译工作以节省时间。用Facade可以降低编译依赖性,限制重要系统中较小的变化所需的重编译工作。Facade模式同样也有利于简化系统在不同平台之间的移植过程,因为编译一个子系统一般不需要编译所有其他的子系统。

3)如果应用需要,它并不限制它们使用子系统类。因此你可以在系统易用性和通用性之间加以选择。

题9:Java 中什么是简单工厂模式?

简单工厂模式又称静态工厂方法模式,在简单工厂模式中,一个工厂类处于对产品类实例化调用的中心位置上,它决定那一个产品类应当被实例化,如同一个交通警察站在来往的车辆流中,决定放行那一个方向的车辆向那一个方向流动一样。

简单工厂模式的具体组成如下:

1)工厂类角色:这是本模式的核心,含有一定的商业逻辑和判断逻辑,用来创建产品。

2)抽象产品角色:它一般是具体产品继承的父类或者实现的接口。

3)具体产品角色:工厂类所创建的对象就是此角色的实例。在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 class DinnerFactory {
     
    public Dinner produce(String animal){
        if(animal.equals("cat")){
            return new CatDinner();
        }else if(animal.equals("dog")){
            return new DogDinner();
        }else{
            System.out.println("请输入存在的动物!");  
            return null;  
        }
    }
}

或者静态化,代码如下:

package com.yoodb;
 
public class DinnerFactory {
     
    public static Dinner produce(String animal){
        if(animal.equals("cat")){
            return new CatDinner();
        }else if(animal.equals("dog")){
            return new DogDinner();
        }else{
            System.out.println("请输入存在的动物!");  
            return null;  
        }
    }
}

4)main函数测试,代码如下:

package com.yoodb;
public class FactoryTest {
    public static void main(String[] args) {
        DinnerFactory factory = new DinnerFactory();
        Dinner dinner = factory.produce("cat");
        dinner.eat();
    }
}

或者静态化调用,代码如下:

package com.yoodb;
 
public class FactoryTest {
    public static void main(String[] args) {
 
        Dinner dinner = DinnerFactory.produce("cat");
        dinner.eat();
    }
}

题10:Java 中代理模式有几种分类?

Java中代理模式有3种分类:

1、静态代理(静态定义代理类)。

2、动态代理(动态生成代理类,也称为Jdk自带动态代理)。

3、Cglib 、javaassist(字节码操作库)。

题11:说说你理解的-spring-中工厂模式

题12:java-中什么时候使用模板方法模式

题13:为什么要使用设计模式

题14:java-中如何实现外观模式

题15:java-中原型模式如何实现深拷贝

题16:java-中原型模式有什么应用场景

题17:java-中工厂模式分为哪几大类

题18:java-中什么是抽象工厂模式

题19:java-中什么是外观模式

题20:java-中实现观察者模式有哪两种方式

题21:java-中原型模式有哪些使用方式

题22:为什么-spring-ioc-要使用工厂模式创建-bean

题23:java-中抽象工厂模式有什么应用场景

题24:java-中如何实现建造者模式

题25:java-中工厂模式有什么优势

大厂面试题

大厂面试题

大厂面试题

Java
1
https://gitee.com/AminDev/ebooks.git
git@gitee.com:AminDev/ebooks.git
AminDev
ebooks
Ebooks
master

搜索帮助

53164aa7 5694891 3bd8fe86 5694891