关于设计模式面试也就这些问题

主要考点

1、单例模式

2、六项设计原则

3、Spring(或者其他简历中写了的框架)中有哪些设计模式

4、项目中使用了哪些设计模式

5、解释某个设计模式(工厂、代理、适配...)

6、JDK(常用的某个JDK类使用了什么设计模式)中有哪些设计模式


1、下面为一个单例的实现代码,请指出代码中有几个错误或不合理之处,并改正。

public class Test {

    public Test instance = null;

    public static Test getInstance() {
        if (instance == null) {
            instance = new Test();
            return instance;
        }
    }
}

单例模式要满足三点:

1、私有化构造方法;

2、创建私有静态对象;

3、提供公有静态方法获取唯一实例。

因此错误包含,1构造函数没有私有化,2对象非私有静态,3获取实例的方法中return不应包含在条件中。

2、用 Java 写一个线程安全的单例模式(Singleton)?

 

双重检查
public class Singleton {

    private static volatile Singleton singleton;

    private Singleton() {}

    public static Singleton getInstance() {
        if (singleton == null) {
            synchronized (Singleton.class) {
                if (singleton == null) {
                    singleton = new Singleton();
                }
            }
        }
        return singleton;
    }
}

3、一个类对象属性发生改变时,如何让调用者知道?

Java event时间监听  ,即在set方法改变属性时,触发 ,这种模式也可以理解为观察者模式,具体查看:观察者模式简单案例和说明

4、 介绍设计模式中command模式用作redo/undo功能的一些细节,并且关于redo/undo的实现除了command模式有没用什么替代方案

5、如何看待设计模式,并简单说说你对观察者模式的理解

答:1、设计模式有神马用     2、观察者模式类图及实现

6、说说你平时用到的设计模式。

单例, 代理,模板,策略,命令 

7、编程中自己都怎么考虑一些设计原则的,比如开闭原则,以及在工作中的应用。

开闭原则(Open Close Principle) 

一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。 

里氏代换原则(Liskov Substitution Principle) 

子类型必须能够替换掉它们的父类型。 

依赖倒转原则(Dependence Inversion Principle) 

高层模块不应该依赖低层模块,二者都应该依赖其抽象;抽象不应该依赖细节;细节应该依赖抽象。即针对接口编程,不要针对实现编程 

接口隔离原则(Interface Segregation Principle) 

建立单一接口,不要建立庞大臃肿的接口,尽量细化接口,接口中的方法尽量少 

组合/聚合复用原则 

说要尽量的使用合成和聚合,而不是继承关系达到复用的目的 

迪米特法则(Law Of Demeter) 

迪米特法则其根本思想,是强调了类之间的松耦合,类之间的耦合越弱,越有利于复用,一个处在弱耦合的类被修改,不会对有关系的类造成影响,也就是说,信息的隐藏促进了软件的复用。 

单一职责原则(Single Responsibility Principle) 

一个类只负责一项职责,应该仅有一个引起它变化的原因 

8、关于 OOP 和设计模式的面试题

  这部分包含 Java 面试过程中关于 SOLID 的设计原则,OOP 基础,如类,对象,接口,继承,多态,封装,抽象以及更高级的一些概念,如组合、聚合及关联。也包含了 GOF 设计模式的问题。

9、接口是什么?为什么要使用接口而不是直接使用具体类?

  接口用于定义 API。它定义了类必须得遵循的规则。同时,它提供了一种抽象,因为客户端只使用接口,这样可以有多重实现,如 List 接口,你可以使用可随机访问的ArrayList,也可以使用方便插入和删除的 LinkedList。接口中不允许写代码,以此来保证抽象,但是 Java 8 中你可以在接口声明静态的默认方法,这种方法是具体的。

10、Java 中,抽象类与接口之间有什么不同?

  Java 中,抽象类和接口有很多不同之处,但是最重要的一个是 Java 中限制一个类只能继承一个类,但是可以实现多个接口。抽象类可以很好的定义一个家族类的默认行为,而接口能更好的定义类型,有助于后面实现多态机制。关于这个问题的讨论请查看答案。

11、你能解释一下里氏替换原则吗?

爸爸能出现的地方儿子也能出现

12、什么情况下会违反迪米特法则?为什么会有这个问题?

  迪米特法则建议“只和朋友说话,不要陌生人说话”,以此来减少类之间的耦合。

13、适配器模式是什么?什么时候使用?

  适配器模式提供对接口的转换。如果你的客户端使用某些接口,但是你有另外一些接口,你就可以写一个适配去来连接这些接口。

14、什么是“依赖注入”和“控制反转”?为什么有人使用?

15、抽象类是什么?它与接口有什么区别?你为什么要使用抽象类?

16、构造器注入和 setter 依赖注入,那种方式更好?

  每种方式都有它的缺点和优点。构造器注入保证所有的注入都被初始化,但是 setter 注入提供更好的灵活性来设置可选依赖。如果使用 XML 来描述依赖,Setter 注入的可读写会更强。经验法则是强制依赖使用构造器注入,可选依赖使用 setter 注入。

17、依赖注入和工程模式之间有什么不同?

  虽然两种模式都是将对象的创建从应用的逻辑中分离,但是依赖注入比工程模式更清晰。通过依赖注入,你的类就是 POJO,它只知道依赖而不关心它们怎么获取。使用工厂模式,你的类需要通过工厂来获取依赖。因此,使用 DI 会比使用工厂模式更容易测试。关于这个话题的更详细讨论请参见答案。

18、适配器模式和装饰器模式有什么区别?

  虽然适配器模式和装饰器模式的结构类似,但是每种模式的出现意图不同。适配器模式被用于桥接两个接口,而装饰模式的目的是在不修改类的情况下给类增加新的功能。

19、适配器模式和代理模式之前有什么不同?

  这个问题与前面的类似,适配器模式和代理模式的区别在于他们的意图不同。由于适配器模式和代理模式都是封装真正执行动作的类,因此结构是一致的,但是适配器模式用于接口之间的转换,而代理模式则是增加一个额外的中间层,以便支持分配、控制或智能访问。

20、什么是模板方法模式?

  模板方法提供算法的框架,你可以自己去配置或定义步骤。例如,你可以将排序算法看做是一个模板。它定义了排序的步骤,但是具体的比较,可以使用 Comparable 或者其语言中类似东西,具体策略由你去配置。列出算法概要的方法就是众所周知的模板方法。

21、什么时候使用访问者模式?

  访问者模式用于解决在类的继承层次上增加操作,但是不直接与之关联。这种模式采用双派发的形式来增加中间层。

22、什么时候使用组合模式?

  组合模式使用树结构来展示部分与整体继承关系。它允许客户端采用统一的形式来对待单个对象和对象容器。当你想要展示对象这种部分与整体的继承关系时采用组合模式。

23、继承和组合之间有什么不同?

  虽然两种都可以实现代码复用,但是组合比继承共灵活,因为组合允许你在运行时选择不同的实现。用组合实现的代码也比继承测试起来更加简单。

24、OOP 中的 组合、聚合和关联有什么区别?

  如果两个对象彼此有关系,就说他们是彼此相关联的。组合和聚合是面向对象中的两种形式的关联。组合是一种比聚合更强力的关联。组合中,一个对象是另一个的拥有者,而聚合则是指一个对象使用另一个对象。如果对象 A 是由对象 B 组合的,则 A 不存在的话,B一定不存在,但是如果 A 对象聚合了一个对象 B,则即使 A 不存在了,B 也可以单独存在。

25、给我一个符合开闭原则的设计模式的例子?

  开闭原则要求你的代码对扩展开放,对修改关闭。这个意思就是说,如果你想增加一个新的功能,你可以很容易的在不改变已测试过的代码的前提下增加新的代码。有好几个设计模式是基于开闭原则的,如策略模式,如果你需要一个新的策略,只需要实现接口,增加配置,不需要改变核心逻辑。一个正在工作的例子是 Collections.sort() 方法,这就是基于策略模式,遵循开闭原则的,你不需为新的对象修改 sort() 方法,你需要做的仅仅是实现你自己的 Comparator 接口。

26、抽象工厂模式和原型模式之间的区别?

27、什么时候使用享元模式?

  享元模式通过共享对象来避免创建太多的对象。为了使用享元模式,你需要确保你的对象是不可变的,这样你才能安全的共享。JDK 中 String 池、Integer 池以及 Long 池都是很好的使用了享元模式的例子。

28、SimpleDataFormat是非线程安全的,如何更好的使用而避免风险呢

关于SimpleDateFormat安全的时间格式化线程安全问题

猜你喜欢

转载自blog.csdn.net/qq_34988624/article/details/86407784