目录

设计模式面试问题(Design Patterns Interview Questions)

亲爱的读者,这些Design Pattern Interview Questions专门设计用于让您熟悉在面试Design Pattern时可能遇到的问题的本质。 根据我的经验,好的面试官在你的面试中几乎不打算问任何特定的问题,通常问题从这个主题的一些基本概念开始,然后他们继续基于进一步的讨论和你回答的内容:

设计模式代表了经验丰富的面向对象软件开发人员使用的最佳实践。 设计模式是软件开发人员在软件开发过程中遇到的一般问题的解决方 这些解决方案是在相当长的一段时间内由众多软件开发人员通过反复试验获得的。

1994年,四位作者Erich Gamma,Richard Helm,Ralph Johnson和John Vlissides出版了一本名为“设计模式 - 可重复使用的面向对象软件的元素”的书,该书启动了软件开发中的设计模式概念。 这些作者统称为四人帮(GOF)。

设计模式可分为三类:创造模式,结构模式和行为模式。

  • Creational Patterns - 这些设计模式提供了一种在隐藏创建逻辑的同时创建对象的方法,而不是使用新的opreator直接实例化对象。 这使程序在决定需要为给定用例创建哪些对象时具有更大的灵活性。

  • Structural Patterns - 这些设计模式涉及类和对象组成。 继承的概念用于组合接口并定义组合对象以获得新功能的方法。

  • Behavioral Patterns - 这些设计模式特别关注对象之间的通信。

这些设计模式特别关注表示层。 这些模式由Sun Java Center识别。

工厂模式是Java中最常用的设计模式之一。 这种类型的设计模式属于创建模式,因为此模式提供了创建对象的最佳方法之一。

在Factory模式中,我们创建对象而不将创建逻辑暴露给客户端,并使用公共接口引用新创建的对象。

抽象工厂模式围绕一个超级工厂工作,创建其他工厂。 这家工厂也被称为工厂工厂。 这种类型的设计模式属于创建模式,因为此模式提供了创建对象的最佳方法之一。

在抽象工厂模式中,接口负责创建相关对象的工厂,而无需显式指定其类。 每个生成的工厂都可以按照工厂模式提供对象。

单例模式是Java中最简单的设计模式之一。 这种类型的设计模式属于创建模式,因为此模式提供了创建对象的最佳方法之一。

此模式涉及单个类,该类负责创建对象,同时确保仅创建单个对象。 此类提供了一种访问其唯一对象的方法,该对象可以直接访问,而无需实例化该类的对象。

这是两步过程。 首先,使构造函数为private,以便不能使用new运算符来实例化该类。 如果不为null,则返回对象的对象,否则创建对象并通过方法返回该对象。

以下是静态类和单例类之间的差异。

  • 静态类不能是顶级类,也不能实现单例类所能实现的接口。

  • 静态类的所有成员都是静态的,但对于Singleton类,它不是必需的。

  • 一个静态类在加载时被初始化,所以它不能被懒惰地加载到单例类可以被延迟加载的地方。

  • 静态类对象存储在堆栈中,而singlton类对象存储在堆内存空间中。

是。

在clone()方法体内抛出异常。

以下是JDK库中使用的一些设计模式。

  • 装饰器类使用Decorator patttern。

  • 单例模式由Runtime,Calendar类使用。

  • 工厂模式由类似Integer.valueOf的Wrapper类使用。

  • 观察者模式由swing,awt等事件处理框架使用。

工厂模式封装了实现细节,可以更改底层实现,而不会对调用者api产生任何影响。

构建器模式使用简单对象并使用逐步方法构建复杂对象。 此构建器独立于其他对象。

原型模式是指在保持性能的同时创建重复对象。 此模式涉及实现原型接口,该接口告诉创建当前对象的克隆。

当直接创建对象成本高时使用此模式。 例如,在昂贵的数据库操作之后创建对象。 我们可以缓存对象,在下一个请求时返回其克隆,并在需要时更新数据库,从而减少数据库调用。

适配器模式充当两个不兼容接口之间的桥梁。 此模式涉及单个类,该类负责连接独立或不兼容接口的功能。

一个真实的例子可能是读卡器的情况,它充当存储卡和笔记本电脑之间的适配器。 您将存储卡插入读卡器和读卡器插入笔记本电脑,以便通过笔记本电脑读取存储卡。

当我们需要将抽象与其实现分离时,使用Bridge,以便两者可以独立变化。 这种类型的设计模式属于结构模式,因为这种模式通过在它们之间提供桥接结构来分离实现类和抽象类。

这种模式涉及一个接口,它充当一个桥梁,使具体类的功能独立于接口实现者类。 两种类型的类都可以在结构上进行更改而不会相互影响。

过滤模式或标准模式是一种设计模式,使开发人员能够使用不同的标准过滤一组对象,并通过逻辑操作以分离的方式将它们链接起来。 这种类型的设计模式属于结构模式,因为该模式结合了多个标准以获得单一标准。

复合模式用于需要以与单个对象类似的方式处理一组对象的位置。 复合模式根据树结构组成对象,以表示部分以及整个层次结构。 这种类型的设计模式属于结构模式,因为此模式创建了一组对象的树结构。

此模式创建一个包含其自己的对象组的类。 此类提供了修改其相同对象组的方法。

装饰器模式允许用户在不改变其结构的情况下向现有对象添加新功能。 这种类型的设计模式属于结构模式,因为此模式充当现有类的包装器。

此模式创建一个装饰器类,它包装原始类并提供其他功能,使类方法签名保持不变。

Facade模式隐藏了系统的复杂性,并为客户端提供了一个接口,客户端可以使用该接口访问系统。 这种类型的设计模式属于结构模式,因为这种模式为现有系统添加了一个接口以隐藏其复杂性。

此模式涉及单个类,它提供客户端所需的简化方法,并委托对现有系统类的方法的调用。

Flyweight模式主要用于减少创建的对象数量,减少内存占用并提高性能。 这种类型的设计模式属于结构模式,因为该模式提供了减少对象数量的方法,从而改善了应用程序的对象结构。

Flyweight模式尝试通过存储它们来重用已存在的类似对象,并在找不到匹配对象时创建新对象。

在代理模式中,类表示另一个类的功能。 这种类型的设计模式属于结构模式。

在代理模式中,我们创建具有原始对象的对象以将其功能与外部世界接口。

顾名思义,责任链模式为请求创建了一系列接收者对象。 此模式根据请求类型将请求的发送方和接收方解耦。 这种模式属于行为模式。

在此模式中,通常每个接收器包含对另一个接收器的引用。 如果一个对象无法处理请求,则它将该对象传递给下一个接收器,依此类推。

命令模式是一种数据驱动的设计模式,属于行为模式类别。 请求作为命令包装在对象下并传递给调用者对象。 Invoker对象查找可以处理此命令的相应对象,并将该命令传递给执行该命令的相应对象。

解释器模式提供了一种评估语言语法或表达的方法。 这种模式属于行为模式。 此模式涉及实现表达式接口,该接口用于解释特定上下文。

此模式用于SQL解析,符号处理引擎等。

Iterator模式是Java和.Net编程环境中非常常用的设计模式。 此模式用于获取以顺序方式访问集合对象的元素的方法,而无需了解其基础表示。 迭代器模式属于行为模式类别。

以下是此类设计模式的实体。

  • Service - 将处理请求的实际服务。 在JNDI服务器中查看此类服务的引用。

  • Context/Initial Context - JNDI上下文携带用于查找目的的服务的引用。

  • Service Locator - 服务定位器是通过JNDI查找缓存服务来获取服务的单一联系点。

  • Cache - 用于存储服务引用的缓存以重用它们。

  • Client - 客户端是通过ServiceLocator调用服务的对象。

介体模式用于减少多个对象或类之间的通信复杂性。 此模式提供了一个中介类,它通常处理不同类之间的所有通信,并支持通过松散耦合轻松维护代码。 中介模式属于行为模式类别。

Memento模式用于将对象的状态恢复到先前的状态。 纪念品模式属于行为模式类别。

Memento模式使用三个actor类。 Memento包含要恢复的对象的状态。 Originator在Memento对象中创建和存储状态,Caretaker对象负责从Memento恢复对象状态。

当对象之间存在一对多关系时使用观察者模式,例如,如果修改了一个对象,则会自动通知其依赖对象。 观察者模式属于行为模式类别。

观察者模式使用三个actor类。 主题,观察者和客户。 Subject是具有将观察者附加和分离到客户端对象的方法的对象。 我们创建了一个抽象类Observer和一个扩展类Observer的具体类Subject。

在状态模式中,类行为会根据其状态而更改。 这种类型的设计模式属于行为模式。 在状态模式中,我们创建表示各种状态的对象和上下文对象,其行为随状态对象的变化而变化。

在Null Object模式中,null对象替换NULL对象实例的检查。 Null Object反映了不做任何关系,而不是检查是否为空值。 在数据不可用的情况下,此类Null对象还可用于提供默认行为。

在Null对象模式中,我们创建一个抽象类,指定要完成的各种操作,扩展此类的具体类和一个null对象类,提供此类的任何实现,并且将在我们需要检查空值的地方无用地使用。

在策略模式中,可以在运行时更改类行为或其算法。 这种类型的设计模式属于行为模式。

在策略模式中,我们创建表示各种策略的对象和根据其策略对象行为不同的上下文对象。 策略对象更改上下文对象的执行算法。

在模板模式中,抽象类公开定义的方式/模板以执行其方法。 它的子类可以根据需要覆盖方法实现,但调用的方式与抽象类的定义相同。 此模式属于行为模式类别。

在Visitor模式中,我们使用一个访问者类来更改元素类的执行算法。 通过这种方式,元素的执行算法可以随着访问者的变化而变化。 此模式属于行为模式类别。 根据模式,元素对象必须接受访问者对象,以便访问者对象处理元素对象上的操作。

MVC Pattern代表模型 - 视图 - 控制器模式。 此模式用于分离应用程序的问题。

  • Model - 模型表示携带数据的对象或JAVA POJO。 如果控制器的数据发生变化,它也可以有更新控制器的逻辑

  • View - 视图表示模型包含的数据的可视化。

  • Controller - 控制器作用于模型和视图。 它控制数据流到模型对象,并在数据发生变化时更新视图。 它使视图和模型分开。

Business Delegate Pattern用于解耦表示层和业务层。 它基本上用于减少表示层代码中的业务层代码的通信或远程查找功能。 在业务层,我们有以下实体。

  • Client - 表示层代码可以是JSP,servlet或UI java代码。

  • Business Delegate - 客户实体提供对业务服务方法的访问的单一入口点类。

  • LookUp Service - 查找服务对象负责获取相关业务实现并提供业务对象访问业务委托对象。

  • Business Service - 商业服务界面。 具体类实现此业务服务以提供实际的业务实现逻辑。

复合实体模式用于EJB持久性机制。 Composite实体是EJB实体bean,表示对象图。 更新复合实体时,内部相关对象bean会自动更新为EJB实体bean管理。 以下是Composite Entity Bean的参与者。

  • Composite Entity - 它是主要的实体bean。 它可以是粗粒度的,也可以包含粗粒度的对象以用于持久性目的。

  • Coarse-Grained Object - 此对象包含依赖对象。 它有自己的生命周期,也管理依赖对象的生命周期。

  • Dependent Object - 依赖对象是一个对象,它依赖于粗粒度对象的持久化生命周期。

  • Strategies - 策略表示如何实现复合实体。

数据访问对象模式或DAO模式用于将低级数据访问API或操作与高级业务服务分开。 以下是数据访问对象模式的参与者。

  • Data Access Object Interface - 此接口定义要对模型对象执行的标准操作。

  • Data Access Object concrete class - 该类实现上述接口。 此类负责从数据源获取数据,该数据源可以是database/xml或任何其他存储机制。

  • Model Object or Value Object - 此对象是包含get/set方法的简单POJO,用于存储使用DAO类检索的数据。

前端控制器设计模式用于提供集中的请求处理机制,以便所有请求将由单个处理程序处理。 此处理程序可以执行身份验证/授权/日志记录或跟踪请求,然后将请求传递给相应的处理程序。 以下是此类设计模式的实体。

  • Front Controller - 用于发送到应用程序的所有类型请求的单一处理程序(基于Web或基于桌面)。

  • Dispatcher - Front Controller可以使用调度程序对象,该对象可以将请求分派给相应的特定处理程序。

  • View - 视图是发出请求的对象。

当我们想要对应用程序的请求或响应进行一些预处理/后处理时,使用拦截过滤器设计模式。 在将请求传递给实际目标应用程序之前,会在请求上定义和应用过滤器。 过滤器可以执行身份验证/授权/记录或跟踪请求,然后将请求传递给相应的处理程序。

以下是此类设计模式的实体。

  • Filter - 在请求处理程序执行请求之前或之后执行特定任务的过滤器。

  • Filter Chain - 过滤链带有多个过滤器,有助于在目标上按照定义的顺序执行它们。

  • Target - 目标对象是请求处理程序。

  • Filter Manager - 过滤器管理器管理过滤器和过滤器链。

  • Client - 客户端是向Target对象发送请求的对象。

当我们想要使用JNDI查找定位各种服务时,使用服务定位器设计模式。 考虑到为服务查找JNDI的高成本,Service Locator模式使用缓存技术。 第一次需要服务时,Service Locator在JNDI中查找并缓存服务对象。 通过Service Locator进行进一步查找或相同的服务在其缓存中完成,这在很大程度上提高了应用程序的性能。

当我们想要从客户端到服务器一次性传递具有多个属性的数据时,使用传输对象模式。 传输对象也称为值对象。 Transfer Object是一个简单的POJO类,具有getter/setter方法,并且是可序列化的,因此可以通过网络传输。 它没有任何行为。 服务器端业务类通常从数据库中提取数据并填充POJO并将其发送到客户端或按值传递。 对于客户端,传输对象是只读的。 客户端可以创建自己的传输对象并将其传递给服务器,以便一次性更新数据库中的值。 以下是此类设计模式的实体。

  • Business Object - 业务服务使用数据填充传输对象。

  • Transfer Object - 简单的POJO,具有仅设置/获取属性的方法。

  • Client - 客户端请求或将传输对象发送到业务对象。

接下来是什么? (What is Next ?)

此外,您可以查看您对该主题所做的过去作业,并确保您能够自信地说出这些作业。 如果你更新鲜,那么面试官不会指望你会回答非常复杂的问题,而是你必须使你的基本概念非常强大。

↑回到顶部↑
WIKI教程 @2018