当前位置: 首页 > 面试题库 >

请你说一下常用设计模式?

花阳辉
2023-03-14
本文向大家介绍请你说一下常用设计模式?相关面试题,主要包含被问及请你说一下常用设计模式?时的应答技巧和注意事项,需要的朋友参考一下

参考回答:

(1)单例模式:保证一个类仅有一个实例,并提供一个访问它的全局访问点,避免一个全局使用的类频繁的创建和销毁,节省系统资源,提高程序效率。

实现方式:

将被实现的类的构造方法设计成private的。

添加此类引用的静态成员变量,并为其实例化。

在被实现的类中提供公共的Create Instance函数,返回实例化的此类,就是2中的静态成员变量。

单例模式只允许创建一个对象,因此节省内存,加快对象访问速度,适用场景:

需要频繁实例化然后销毁的对象。

创建对象时耗时过多或者耗资源过多,但又经常用到的对象。

有状态的工具类对象。

频繁访问数据库或文件的对象。

场景举例

每台计算机有若干个打印机,但只能有一个PrinterSpooler,以避免两个打印作业同时输出到打印机;

Windows的TaskManager(任务管理器),不能打开两个windows task manager;

Windows的Recycle Bin(回收站),在整个系统运行过程中,回收站一直维护着仅有的一个实例;

网站的计数器,一般也是采用单例模式实现,否则难以同步;

(2)策略模式:策略模式是把一个类中经常改变或者将来可能改变的部分提取出来作为一个接口,然后在类中包含这个对象的实例,这样类的实例在运行时就可以随意调用实现了这个接口的类的行为。

实现方式:

提供公共接口或抽象类,定义需要使用的策略方法。(策略抽象类)

多个实现的策略抽象类的实现类。(策略实现类)

环境类,对多个实现类的封装,提供接口类型的成员量,可以在客户端中切换。

客户端调用环境类进行不同策略的切换。

类图:

img

Strategy:策略接口,用来约束一系列具体的策略算法。Context使用这个接口来调用具体的策略,实现定义的策略。

ConcreteStrategy:具体的策略实现,也就是具体的算法实现。

Context:上下文,负责与具体的策略交互,通常上下文会持有一个真正的策略实现。

适用场景:

如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。

一个系统需要动态地在几种算法中选择一种。

一个类定义了多种行为, 并且这些行为在这个类的操作中以多个条件语句的形式出现。将相关的条件分支移入它们各自的Strategy类中以代替这些条件语句。

(3)简单工厂模式:定义一个用于创建对象的接口或抽象类,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类。

类图:

img

实现方式:

抽象产品类(Product),是所创建的所有对象的父类,负责描述所有实例所共有的公共接口

多个具体的产品类(Concrete Product),具体产品角色是创建目标,所有创建的对象都充当这个角色的某个具体类的实例。

工厂类(Creator),负责实现创建所有实例的内部逻辑

适用场景:

在任何需要生成复杂对象的地方,都可以使用工厂方法模式。

当需要系统有比较好的扩展性时,可以考虑工厂模式,不同的产品用不同的实现工厂来组装。

(4)装饰模式:允许向一个现有的对象添加新的功能,同时又不改变其结构,以在不使用创造更多子类的情况下,将对象的功能加以扩展。

类图:

img

实现方式:

抽象构件(Component)角色:给出一个抽象接口,以规范准备接收附加责任的对象。

具体构件(ConcreteComponent)角色:定义一个将要接收附加责任的类。

装饰(Decorator)角色:持有一个构件(Component)对象的实例,并定义一个与抽象构件接口一致的接口。

具体装饰(ConcreteDecorator)角色:负责给构件对象“贴上”附加的责任。

适用场景:

扩展一个类的功能。

动态增加功能,动态撤销。

(5)观察者模式:对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。

类图:

img

抽象主题(Subject)角色:把所有对观察者对象的引用保存在一个集合中,每个抽象主题角色都可以有任意数量的观察者。抽象主题提供一个接口,可以增加和删除观察者角色。一般用一个抽象类和接口来实现。

抽象观察者(Observer)角色:为所有具体的观察者定义一个接口,在得到主题的通知时更新自己。

具体主题(ConcreteSubject)角色:在具体主题内部状态改变时,给所有登记过的观察者发出通知。具体主题角色通常用一个子类实现。

具体观察者(ConcreteObserver)角色:该角色实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题的状态相协调。通常用一个子类实现。如果需要,具体观察者角色可以保存一个指向具体主题角色的引用。

适用场景:

当一个抽象模型有两个方面, 其中一个方面依赖于另一方面。将这二者封装在独立的对象中以使它们可以各自独立地改变和复用。

当对一个对象的改变需要同时改变其它对象, 而不知道具体有多少对象有待改变。

当一个对象必须通知其它对象,而它又不能假定其它对象是谁。换言之, 你不希望这些对象是紧密耦合的。

 

 类似资料:
  • 本文向大家介绍说一下你熟悉的设计模式?相关面试题,主要包含被问及说一下你熟悉的设计模式?时的应答技巧和注意事项,需要的朋友参考一下 单例模式:保证被创建一次,节省系统开销。 工厂模式(简单工厂、抽象工厂):解耦代码。 观察者模式:定义了对象之间的一对多的依赖,这样一来,当一个对象改变时,它的所有的依赖者都会收到通知并自动更新。 外观模式:提供一个统一的接口,用来访问子系统中的一群接口,外观定义了一

  • 本文向大家介绍请你说一下设计测试用例的方法相关面试题,主要包含被问及请你说一下设计测试用例的方法时的应答技巧和注意事项,需要的朋友参考一下 参考回答: 黑盒测试: 1.等价类划分 等价类划分是将系统的输入域划分为若干部分,然后从每个部分选取少量代表性数据进行测试。等价类可以划分为有效等价类和无效等价类,设计测试用例的时候要考虑这两种等价类。 2.边界值分析法 边界值分析法是对等价类划分的一种补充,

  • 本文向大家介绍请说说你了解的设计模式有哪些?相关面试题,主要包含被问及请说说你了解的设计模式有哪些?时的应答技巧和注意事项,需要的朋友参考一下 1、单例模式 在软件系统中,经常有这样一些特殊的类,必须保证它们在系统中只存在一个实例,才能确保它们的逻辑正确性、以及良好的效率。保证一个类仅有一个实例,并提供一个该实例的全局访问点。 (1)经典模式--单线程 对于线程来说不安全;但在单线程中已满足要求。

  • 本文向大家介绍请你说一下jmeter相关面试题,主要包含被问及请你说一下jmeter时的应答技巧和注意事项,需要的朋友参考一下 参考回答: Jmeter:Apache JMeter是Apache组织开发的基于Java的压力测试工具。用于对软件做压力测试,它最初被设计用于Web应用测试,但后来扩展到其他测试领域。 它可以用于测试静态和动态资源,例如静态文件、Java 小服务程序、CGI 脚本、Jav

  • 本文向大家介绍请你来说一下reactor模型组成 ?相关面试题,主要包含被问及请你来说一下reactor模型组成 ?时的应答技巧和注意事项,需要的朋友参考一下 reactor模型要求主线程只负责监听文件描述上是否有事件发生,有的话就立即将该事件通知工作线程,除此之外,主线程不做任何其他实质性的工作,读写数据、接受新的连接以及处理客户请求均在工作线程中完成。其模型组成如下: 1)Handle:即操作

  • 本文向大家介绍请你说一说测试的常用方法相关面试题,主要包含被问及请你说一说测试的常用方法时的应答技巧和注意事项,需要的朋友参考一下 参考回答: 黑盒测试: 黑盒测试也称功能测试或数据驱动测试,它是在已知产品所应具有的功能,通过测试来检测每个功能是否都能正常使用,在测试时,把程序看作一个不能打开的黑盆子,在完全不考虑程序内部结构和内部特性的情况下,测试者在程序接口进行测试,它只检查程序功能是否按照需