Java 面试八股文2023:设计模式概述与常见应用

发布时间: 2024-04-09 21:40:17 阅读量: 44 订阅数: 21
# 1. 设计模式基础概念 ## 1.1 设计模式简介 设计模式是在软件开发过程中对一类常见问题的通用解决方案。它是解决软件设计中常见问题的最佳实践经验的总结,是经验的提炼和抽象。设计模式提供了一套通用的设计方案,帮助我们更好地应对变化、提高代码质量、增加代码的可重用性和可维护性。 ## 1.2 为什么要使用设计模式 - 提高代码的重用性:设计模式可帮助我们避免重复编写相同的代码 - 提高代码的可维护性:设计模式提供了良好的代码组织结构,使代码的可读性更强 - 降低代码的耦合性:通过设计模式,不同的部分之间的依赖关系更加清晰 - 促进代码的扩展性:设计模式可以使系统更容易扩展新功能 ## 1.3 设计模式的分类 设计模式一般分为三种主要类型: - **创建型设计模式**:用于处理对象的创建机制,包括单例模式、工厂模式、抽象工厂模式等 - **结构型设计模式**:处理对象之间的组合,包括适配器模式、装饰器模式、代理模式等 - **行为型设计模式**:描述对象间的协作和职责分配,包括观察者模式、策略模式、模板方法模式等 通过以上概述,我们对设计模式的基础概念有了一定的了解。接下来,我们将深入探讨各种设计模式的具体应用及重要性。 # 2. 创建型设计模式 ### 2.1 单例模式 - **定义**:确保一个类只有一个实例,并提供全局访问点。 - **应用场景**:需要全局访问点的场景,如配置信息、日志记录等。 #### 单例模式示例代码(Java): ```java public class Singleton { private static Singleton instance; private Singleton() {} public static Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } } ``` - **优点**: - 节省内存资源,避免多次创建对象。 - 确保全局访问点,方便统一管理。 - **缺点**: - 可能会引起多线程安全问题。 ### 2.2 工厂模式 - **定义**:定义一个创建对象的接口,让子类决定实例化哪个类。 - **应用场景**:需要统一创建对象的场景,根据不同需求创建不同的实例。 #### 工厂模式示例代码(Java): ```java // 抽象产品 interface Product { void show(); } // 具体产品A class ConcreteProductA implements Product { public void show() { System.out.println("This is product A."); } } // 工厂 class Factory { public Product createProduct(String type) { if ("A".equals(type)) { return new ConcreteProductA(); } return null; } } ``` - **优点**: - 遵循开闭原则,新增产品无需修改现有代码。 - 将对象的创建和使用分离,降低耦合度。 - **缺点**: - 增加了类的数量,增加了系统的复杂度。 #### 工厂模式流程图: ```mermaid graph TD A[Client] -->|Request Product| B(Factory) B -->|Create Product| C{Product} C -->|Return Product| A ``` # 3. 结构型设计模式 结构型设计模式主要关注如何将类或对象结合在一起形成更大的结构,提供了一种简单的方法来实现对象组合。 ### 3.1 适配器模式 适配器模式是一种结构型设计模式,用于允许不兼容接口的类之间协同工作。通过适配器,客户端可以与不同接口的类进行交互,而不需要改变其源代码。 在适配器模式中,有三个主要角色: - 目标接口(Target):定义客户端使用的特定接口。 - 适配器(Adapter):实现目标接口,并包装一个被适配者的实例。 - 被适配者(Adaptee):已存在的类,包含客户端希望使用的功能,但其接口与目标接口不兼容。 下面是适配器模式的Java示例代码: ```java // 目标接口 interface Target { void request(); } // 被适配者 class Adaptee { public void specificRequest() { System.out.println("Adaptee's specific request"); } } // 适配器 class Adapter implements Target { private Adaptee adaptee; public Adapter(Adaptee adaptee) { this.adaptee = adaptee; } @Override public void request() { adaptee.specificRequest(); } } // 客户端代码 public class AdapterPatternExample { public static void main(String[] args) { Adaptee adaptee = new Adaptee(); Target adapter = new Adapter(adaptee); adapter.request(); } } ``` ### 3.2 装饰器模式 装饰器模式是一种结构型设计模式,允许向一个现有对象添加新功能,同时又不改变其结构。这种模式创建了一个装饰类,用于包装原有类,并提供额外的功能。 在装饰器模式中,有四个主要角色: - 抽象构件(Component):定义了原始对象和装饰对象的公共接口。 - 具体构件(ConcreteComponent):实现了抽象构件接口,是被装饰的原始对象。 - 抽象装饰器(Decorator):继承了抽象构件,并包含了一个指向抽象构件的引用。 - 具体装饰器(ConcreteDecorator):继承自抽象装饰器,负责向构件添加新的功能。 下面是装饰器模式的Python示例代码: ```python # 抽象构件 class Component: def operation(self): pass # 具体构件 class ConcreteComponent(Component): def operation(self): print("ConcreteComponent operation") # 抽象装饰器 class Decorator(Component): def __init__(self, component): self.component = component def operation(self): self.component.operation() # 具体装饰器 class ConcreteDecorator(Decorator): def operation(self): super().operation() print("Added new functionality") # 客户端代码 component = ConcreteComponent() decorator = ConcreteDecorator(component) decorator.operation() ``` ### 3.3 代理模式 代理模式是一种结构型设计模式,通过创建一个代理对象,代理可以控制对原始对象的访问。代理可以在访问原始对象前后进行一些额外的操作,如记录日志、权限验证等。 在代理模式中,有三个主要角色: - 抽象主题(Subject):定义了真实主题和代理的共同接口,客户端通过代理和真实主题交互。 - 真实主题(RealSubject):实现了抽象主题接口,是客户端直接调用的对象。 - 代理
corwn 最低0.47元/天 解锁专栏
买1年送1年
点击查看下一篇
profit 百万级 高质量VIP文章无限畅学
profit 千万级 优质资源任意下载
profit C知道 免费提问 ( 生成式Al产品 )

相关推荐

doc
浅析java常用的设计模式(doc 23页) 1、工厂模式:客户类和工厂类分开。消费者任何时候需要某种产品,只需向工厂请求即 可。消费者无须修改就可以接纳新产品。缺点是当产品修改时,工厂类也要做相应的修 改。如:如何创建及如何向客户端提供。   2、建造模式:将产品的内部表象和产品的生成过程分割开来,从而使一个建造过程 生成具有不同的内部表象的产品对象。建造模式使得产品内部表象可以独立的变化,客 户不必知道产品内部组成的细节。建造模式可以强制实行一种分步骤进行的建造过程。   3、工厂方法模式:核心工厂类不再负责所有产品的创建,而是将具体创建的工作交 给子类去做,成为一个抽象工厂角色,仅负责给出具体工厂类必须实现的接口,而不接 触哪一个产品类应当被实例化这种细节。   4、原始模型模式:通过给出一个原型对象来指明所要创建的对象的类型,然后用复 制这个原型对象的方法创建出更多同类型的对象。原始模型模式允许动态的增加或减少 产品类,产品类不需要非得有任何事先确定的等级结构,原始模型模式适用于任何的等 级结构。缺点是每一个类都必须配备一个克隆方法。   5、单例模式:单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统 提供这个实例单例模式。单例模式只应在有真正的"单一实例"的需求时才可使用。   6、适配器(变压器)模式:把一个类的接口变换成客户端所期待的另一种接口,从 而使原本因接口原因不匹配而无法一起工作的两个类能够一起工作。适配类可以根据参 数返还一个合适的实例给客户端。   7、桥梁模式:将抽象化与实现化脱耦,使得二者可以独立的变化,也就是说将他们 之间的强关联变成弱关联,也就是指在一个软件系统的抽象化和实现化之间使用组合/聚 合关系而不是继承关系,从而使两者可以独立的变化。   8、合成模式:合成模式将对象组织到树结构中,可以用来描述整体与部分的关系。 合成模式就是一个处理对象的树结构的模式。合成模式把部分与整体的关系用树结构表 示出来。合成模式使得客户端把一个个单独的成分对象和由他们复合而成的合成对象同 等看待。   9、装饰模式:装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个 替代方案,提供比继承更多的灵活性。动态给一个对象增加功能,这些功能可以再动态 的撤消。增加由一些基本功能的排列组合而产生的非常大量的功能。 一个代理对象,并由代理对象控制对源对象的引用。代理就是一个人或一个机构代表另 一个人或者一个机构采取行动。某些情况下,客户不想或者不能够直接引用一个对象, 代理对象可以在客户和目标对象直接起到中介的作用。客户端分辨不出代理主题对象与 真实主题对象。代理模式可以并不知道真正的被代理对象,而仅仅持有一个被代理对象 的接口,这时候代理对象不能够创建被代理对象,被代理对象必须有系统的其他角色代 为创建并传入。   13、责任链模式:在责任链模式中,很多对象由每一个对象对其下家的引用而接   起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。 客户并不知道链上的哪一个对象最终处理这个请求,系统可以在不影响客户端的情况下 动态的重新组织链和分配责任。处理者有两个选择:承担责任或者把责任推给下家。一 个请求可以最终不被任何接收端对象所接受。   14、命令模式:命令模式把一个请求或者操作封装到一个对象中。命令模式把发出 命令的责任和执行命令的责任分割开,委派给不同的对象。命令模式允许请求的一方和 发送的一方独立开来,使得请求的一方不必知道接收请求的一方的接口,更不必知道请 求是怎么被接收,以及操作是否执行,何时被执行以及是怎么被执行的。系统支持命令 的撤消。   15、解释器模式:给定一个语言后,解释器模式可以定义出其文法的一种表示,并 同时提供一个解释器。客户端可以使用这个解释器来解释这个语言中的句子。解释器模 式将描述怎样在有了一个简单的文法后,使用模式设计解释这些语句。在解释器模式里 面提到的语言是指任何解释器对象能够解释的任何组合。在解释器模式中需要定义一个 代表文法的命令类的等级结构,也就是一系列的组合规则。每一个命令对象都有一个解 释方法,代表对命令对象的解释。命令对象的等级结构中的对象的任何排列组合都是一 个语言。   16、迭代子模式:迭代子模式可以顺序访问一个聚集中的元素而不必暴露聚集的内 部表象。多个对象聚在一起形成的总体称之为聚集,聚集对象是能够包容一组对象的容 器对象。迭代子模式将迭代逻辑封装到一个独立的子对象中,从而与聚集本身隔开。迭 代子模式简化了聚集的界面。每一个聚集对象都可以有一个或一个以上的迭代子对象, 每一个迭代子的迭代状态可以是彼此独立的。迭代算法可以独立于聚集角色变化。   17、调停者模式:调停者模式包装了一系列对象相互作用的方式,使得

SW_孙维

开发技术专家
知名科技公司工程师,开发技术领域拥有丰富的工作经验和专业知识。曾负责设计和开发多个复杂的软件系统,涉及到大规模数据处理、分布式系统和高性能计算等方面。
专栏简介
“Java 面试八股文 2023”专栏汇集了 Java 技术面试的必备知识点,从入门基础到进阶应用,全面覆盖 Java 核心技术。专栏文章涵盖了面向对象编程、集合框架、多线程编程、IO 与 NIO、JVM 虚拟机、设计模式、Spring 框架、Spring Boot、Spring Cloud、MyBatis、Restful API、分布式系统、消息队列、Docker、Kubernetes、微服务架构监控和 ELK 栈等内容。通过阅读本专栏,读者可以快速掌握 Java 面试中的常见考点,为求职面试做好充分准备。
最低0.47元/天 解锁专栏
买1年送1年
百万级 高质量VIP文章无限畅学
千万级 优质资源任意下载
C知道 免费提问 ( 生成式Al产品 )

最新推荐

ggthemes包热图制作全攻略:从基因表达到市场分析的图表创建秘诀

# 1. ggthemes包概述和安装配置 ## 1.1 ggthemes包简介 ggthemes包是R语言中一个非常强大的可视化扩展包,它提供了多种主题和图表风格,使得基于ggplot2的图表更为美观和具有专业的视觉效果。ggthemes包包含了一系列预设的样式,可以迅速地应用到散点图、线图、柱状图等不同的图表类型中,让数据分析师和数据可视化专家能够快速产出高质量的图表。 ## 1.2 安装和加载ggthemes包 为了使用ggthemes包,首先需要在R环境中安装该包。可以使用以下R语言命令进行安装: ```R install.packages("ggthemes") ```

【R语言数据包googleVis性能优化】:提升数据可视化效率的必学技巧

![【R语言数据包googleVis性能优化】:提升数据可视化效率的必学技巧](https://cyberhoot.com/wp-content/uploads/2020/07/59e4c47a969a8419d70caede46ec5b7c88b3bdf5-1024x576.jpg) # 1. R语言与googleVis简介 在当今的数据科学领域,R语言已成为分析和可视化数据的强大工具之一。它以其丰富的包资源和灵活性,在统计计算与图形表示上具有显著优势。随着技术的发展,R语言社区不断地扩展其功能,其中之一便是googleVis包。googleVis包允许R用户直接利用Google Char

数据驱动的决策制定:ggtech包在商业智能中的关键作用

![数据驱动的决策制定:ggtech包在商业智能中的关键作用](https://opengraph.githubassets.com/bfd3eb25572ad515443ce0eb0aca11d8b9c94e3ccce809e899b11a8a7a51dabf/pratiksonune/Customer-Segmentation-Analysis) # 1. 数据驱动决策制定的商业价值 在当今快速变化的商业环境中,数据驱动决策(Data-Driven Decision Making, DDDM)已成为企业制定策略的关键。这一过程不仅依赖于准确和及时的数据分析,还要求能够有效地将这些分析转化

ggpubr包在金融数据分析中的应用:图形与统计的完美结合

![ggpubr包在金融数据分析中的应用:图形与统计的完美结合](https://statisticsglobe.com/wp-content/uploads/2022/03/ggplot2-Font-Size-R-Programming-Language-TN-1024x576.png) # 1. ggpubr包与金融数据分析简介 在金融市场中,数据是决策制定的核心。ggpubr包是R语言中一个功能强大的绘图工具包,它在金融数据分析领域中提供了一系列直观的图形展示选项,使得金融数据的分析和解释变得更加高效和富有洞察力。 本章节将简要介绍ggpubr包的基本功能,以及它在金融数据分析中的作

R语言动态图形:使用aplpack包创建动画图表的技巧

![R语言动态图形:使用aplpack包创建动画图表的技巧](https://environmentalcomputing.net/Graphics/basic-plotting/_index_files/figure-html/unnamed-chunk-1-1.png) # 1. R语言动态图形简介 ## 1.1 动态图形在数据分析中的重要性 在数据分析与可视化中,动态图形提供了一种强大的方式来探索和理解数据。它们能够帮助分析师和决策者更好地追踪数据随时间的变化,以及观察不同变量之间的动态关系。R语言,作为一种流行的统计计算和图形表示语言,提供了丰富的包和函数来创建动态图形,其中apl

R语言机器学习可视化:ggsic包展示模型训练结果的策略

![R语言机器学习可视化:ggsic包展示模型训练结果的策略](https://training.galaxyproject.org/training-material/topics/statistics/images/intro-to-ml-with-r/ggpairs5variables.png) # 1. R语言在机器学习中的应用概述 在当今数据科学领域,R语言以其强大的统计分析和图形展示能力成为众多数据科学家和统计学家的首选语言。在机器学习领域,R语言提供了一系列工具,从数据预处理到模型训练、验证,再到结果的可视化和解释,构成了一个完整的机器学习工作流程。 机器学习的核心在于通过算

ggmap包在R语言中的应用:定制地图样式的终极教程

![ggmap包在R语言中的应用:定制地图样式的终极教程](https://opengraph.githubassets.com/d675fb1d9c3b01c22a6c4628255425de321d531a516e6f57c58a66d810f31cc8/dkahle/ggmap) # 1. ggmap包基础介绍 `ggmap` 是一个在 R 语言环境中广泛使用的包,它通过结合 `ggplot2` 和地图数据源(例如 Google Maps 和 OpenStreetMap)来创建强大的地图可视化。ggmap 包简化了地图数据的获取、绘图及修改过程,极大地丰富了 R 语言在地理空间数据分析

R语言中的数据可视化工具包:plotly深度解析,专家级教程

![R语言中的数据可视化工具包:plotly深度解析,专家级教程](https://opengraph.githubassets.com/c87c00c20c82b303d761fbf7403d3979530549dc6cd11642f8811394a29a3654/plotly/plotly.py) # 1. plotly简介和安装 Plotly是一个开源的数据可视化库,被广泛用于创建高质量的图表和交互式数据可视化。它支持多种编程语言,如Python、R、MATLAB等,而且可以用来构建静态图表、动画以及交互式的网络图形。 ## 1.1 plotly简介 Plotly最吸引人的特性之一

文本挖掘中的词频分析:rwordmap包的应用实例与高级技巧

![文本挖掘中的词频分析:rwordmap包的应用实例与高级技巧](https://drspee.nl/wp-content/uploads/2015/08/Schermafbeelding-2015-08-03-om-16.08.59.png) # 1. 文本挖掘与词频分析的基础概念 在当今的信息时代,文本数据的爆炸性增长使得理解和分析这些数据变得至关重要。文本挖掘是一种从非结构化文本中提取有用信息的技术,它涉及到语言学、统计学以及计算技术的融合应用。文本挖掘的核心任务之一是词频分析,这是一种对文本中词汇出现频率进行统计的方法,旨在识别文本中最常见的单词和短语。 词频分析的目的不仅在于揭

【R语言qplot深度解析】:图表元素自定义,探索绘图细节的艺术(附专家级建议)

![【R语言qplot深度解析】:图表元素自定义,探索绘图细节的艺术(附专家级建议)](https://www.bridgetext.com/Content/images/blogs/changing-title-and-axis-labels-in-r-s-ggplot-graphics-detail.png) # 1. R语言qplot简介和基础使用 ## qplot简介 `qplot` 是 R 语言中 `ggplot2` 包的一个简单绘图接口,它允许用户快速生成多种图形。`qplot`(快速绘图)是为那些喜欢使用传统的基础 R 图形函数,但又想体验 `ggplot2` 绘图能力的用户设