编程技术是改变世界的力量。
本站
当前位置:网站首页 > 后端语言 > 正文

Java程序员必须掌握的15个设计模式,特点和使用场景汇总整理!

gowuye 2024-04-03 16:15 16 浏览 0 评论

设计模式是一种广泛使用的编程思想,它是一种用于解决特定问题的经验性方法,提供了一套通用的解决方案,可用于不同的应用场景,可以帮助我们解决常见的问题并提高代码的可重用性和可维护性。

设计模式分为三类:创建型设计模式、结构型设计模式和行为型设计模式

一、创建型设计模式

创建型设计模式用于封装对象的创建过程,它们可以帮助我们在不暴露对象创建过程的情况下创建对象。以下是常见的创建型设计模式:

1. 工厂方法模式

工厂方法模式(Factory Method Pattern)是一种用于封装对象创建过程的模式。它定义了一个创建对象的接口,但让子类决定实例化哪个类。工厂方法使得一个类的实例化延迟到其子类。

优点:子类可以在运行时决定创建的对象类型,而且可以避免客户端与具体类耦合。同时,它也很容易增加新的产品线。

使用场景:当我们需要隐藏对象创建过程,并让客户端通过抽象接口来创建对象时,可以考虑使用工厂方法模式。例如,当我们需要创建不同的消息对象时,可以使用工厂方法模式来创建消息对象。

2. 抽象工厂模式

抽象工厂模式(Abstract Factory Pattern)是一种用于创建相关或独立对象族的模式。它提供了一种接口,该接口可以创建一系列产品,但不需要指定具体的产品类。

优点:它可以隐藏产品的具体实现,以及如何创建这些产品。同时,它也使得客户端可以独立于具体的产品创建过程。

使用场景:当我们需要创建一系列相关或独立的对象时,可以考虑使用抽象工厂模式。例如,当我们需要创建一系列不同类型的手机和电视时,可以使用抽象工厂模式。

3. 单例模式

单例模式(Singleton Pattern)是一种用于限制类的实例化次数的模式。它保证一个类只有一个实例,并提供全局访问点。

优点:它可以节省系统资源,并且可以避免多个对象之间的冲突。

使用场景:当一个类只需要一个实例时,可以考虑使用单例模式。例如,当一个类需要负责管理应用程序的配置信息时,可以使用单例模式。

4. 建造者模式

建造者模式(Builder Pattern)是一种用于封装复杂对象构建过程的模式。它将对象的构建和表示分离,使得相同的构建过程可以创建不同的表示。

优点:它可以灵活地创建对象,并且可以避免重复的构建过程。同时,它也很容易扩展,因为每个部件都是独立的。

使用场景:当我们需要构建一些复杂的对象时,可以考虑使用建造者模式,例如,当我们需要创建一个电子商品时,可以使用建造者模式来创建商品对象。

5. 原型模式

原型模式(Prototype Pattern)是一种用于创建对象的模式,它通过复制现有的对象来创建新的对象。原型模式通过克隆现有对象来创建新对象,而不是通过调用构造函数。

优点:它可以减少对象创建的开销,并且可以最大限度地利用已有对象。同时,它还可以避免构造函数的限制。

使用场景:当我们需要创建大量相似的对象时,可以考虑使用原型模式,例如,当我们需要创建多个相似的线图或柱图对象时,可以使用原型模式来复制现有的对象。

二、结构型设计模式

结构型设计模式用于将对象组合成更大、更复杂的结构,以便于更好地组织代码。以下是常见的结构型设计模式:

1. 适配器模式

适配器模式(Adapter Pattern)是一种用于将不兼容的对象转换为兼容对象的模式。它通过使一个类的接口适用另一个接口来完成这个过程。适配器模式既可以是类适配器,也可以是对象适配器。

优点:它可以使得原本不兼容的对象可以协同工作。同时,它还可以减少代码的冗余。

使用场景:当我们需要将一个类的接口转换为其他类所期望的接口时,可以考虑使用适配器模式。例如,当我们需要将一个第三方类库的接口转换为我们的应用程序所期望的接口时,可以使用适配器模式。

2. 桥接模式

桥接模式(Bridge Pattern)是一种用于将抽象和实现分离的设计模式。它通过使用一个中间类来链接抽象和实现,使得它们可以独立地变化。

优点:它可以减少类之间的耦合,并且可以使得抽象和实现可以独立地进行变化。

使用场景:当我们需要将抽象和实现分离,并且需要对它们进行独立的变化时,可以考虑使用桥接模式。例如,当我们需要将一个笔刷分为硬笔刷和软笔刷时,可以使用桥接模式来实现。

3. 组合模式

组合模式(Composite Pattern)是一种用于将对象组成树形结构的模式。它将单个对象和组合对象中的对象统一看作一个对象,这样用户无需了解其中细节即可处理它们。

优点:它可以简化客户端代码,并且可以使得增加或删除节点时非常容易。

使用场景:当我们需要组合单个对象和组合对象时,可以使用组合模式。例如,当我们需要创建一个菜单时,可以使用组合模式来组合不同的菜单项。

4. 装饰器模式

装饰器模式(Decorator Pattern)是一种用于动态地给对象添加职责的模式。它在不改变原有类的基础上,通过将对象包装在一个装饰器类中,来实现对对象功能的扩展。

优点:它可以在运行时动态地扩展一个对象的职责,而不需要修改源代码。同时,它也很容易扩展,因为每个装饰器都是独立的。

使用场景:当我们需要在运行时动态地扩展一个对象的功能时,可以考虑使用装饰器模式。例如,当我们需要给某个对象动态地添加日志、验证或缓存等功能时,可以使用装饰器模式。

5. 外观模式

外观模式(Facade Pattern)是一种用于隐藏复杂子系统的复杂性,并提供一个简单接口的模式。外观模式将复杂的子系统组合在一起,并提供一个简单接口来简化客户端调用。

优点:它可以简化客户端代码,并且可以隔离复杂子系统的实现细节。

使用场景:当我们需要对复杂子系统进行封装,并提供一个简单接口时,可以考虑使用外观模式。例如,当我们需要对数据库进行操作时,可以使用外观模式来封装数据库访问过程。

三、行为型设计模式

行为型设计模式关注对象之间的通信和协作。以下是常见的行为型设计模式:

1. 策略模式

策略模式(Strategy Pattern)是一种用于定义一系列算法,以及提供一种在运行时可以切换算法的方式的模式。该模式允许算法独立于客户端而变化。

优点:它可以很容易地替换算法,并且可以避免使用大量的条件语句。同时,它也可以提高代码的可扩展性和可维护性。

使用场景:当我们需要在运行时根据不同的需求选择不同的算法时,可以考虑使用策略模式。例如,当我们需要根据不同的用户类型计算不同的折扣时,可以使用策略模式来实现。

2. 观察者模式

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

优点:它可以使得对象之间的耦合度更低,并且可以提高代码的可维护性和可扩展性。

使用场景:当我们需要建立对象之间一对多的依赖关系时,可以考虑使用观察者模式。例如,当我们需要实现一个简单的消息通知系统时,可以使用观察者模式来实现。

3. 命令模式

命令模式(Command Pattern)是一种将请求封装成对象的模式,以便于存储、传递和使用。命令模式将请求接收者和请求发送者从彼此解耦,使得请求可以被重复执行、取消和排队。

优点:它可以对请求进行操作,并且可以灵活地添加新的命令,同时也可以很容易地撤销和重做操作。

使用场景:当我们需要对操作进行封装,并且需要支持撤销和重做操作时,可以考虑使用命令模式。例如,当我们需要实现一个简单的文本编辑器时,可以使用命令模式来实现。

4. 迭代器模式

迭代器模式(Iterator Pattern)是一种提供一种方法顺序访问聚合对象中各个元素的模式。迭代器模式将集合和遍历操作分离开来,使得可以对集合进行不同方式的遍历,而无需改变集合本身的结构。

优点:它可以隔离遍历算法和数据结构,并且可以简化遍历代码。

使用场景:当我们需要遍历一系列对象时,可以考虑使用迭代器模式。例如,当我们需要对一个图像集合进行遍历时,可以使用迭代器模式来实现。

5. 责任链模式

责任链模式(Chain of Responsibility Pattern)是一种用于将多个处理对象连成一条链,并依次处理请求的模式。每个处理对象都可以决定是否处理请求,以及是否将请求传递给下一个处理对象。

优点:它可以避免客户端和处理对象之间的耦合,同时也可以提高代码的可扩展性和可维护性。

使用场景:当我们需要将请求发送给多个处理对象,并且让它们依次处理请求时,可以考虑使用责任链模式。例如,当我们需要处理一个订单时,可以使用责任链模式来处理订单状态的变化。

总结

本文介绍了三种常见的设计模式:创建型设计模式、结构型设计模式和行为型设计模式。这些模式都有各自的优点和使用场景,可以帮助开发人员更好地组织代码,并提高代码的可扩展性和可维护性。在实际开发过程中,我们应该根据不同的需求选择不同的模式,并灵活地使用它们。

在后续的文章合集中,我会详细介绍每一种设计模式的原理及其使用场景,请关注我的后续文章。一天一个设计模式(一):观察者模式,松耦合的Java代码利器


对于本文中整理的设计模式,不知道你有没有什么看法,欢迎在评论区里留言。如果你对我的文章内容感兴趣,请点击关注,谢谢支持! [谢谢][谢谢][谢谢]

相关推荐

爱上开源之golang入门至实战第四章-切片(Slice)

前言Go数组的长度不可改变,在特定场景中这样的集合就不太适用,Go中提供了一种灵活,功能强悍的内置类型切片("动态数组"),与数组相比切片的长度是不固定的,可以追加元素,在追加时可...

Go语言入门必知教程-切片

切片是一种灵活的和可扩展的数据结构,用于实现和管理数据集。切片由多个元素组成,所有元素都是相同类型的。切片是动态数组的一部分,可以根据需要进行增长和收缩。与数组一样,切片也可以索引。切片具有容量和长度...

Go语言基础-切片

切片是什么?切片是Go语言的一种数据结构。和数组相似,不过切片可以在它的结尾增加更多的元素。这样可变长度在实际编程中更为有用。声明切片切片的声明和数组也很相似,只是声明切片时不需要指定大小。例:va...

5分钟掌握GO中切片的基本使用方法

最近Golang越来越火,不少小伙伴都纷纷开始学习Golang,但对于原先为C++或者JAVA的同学,用习惯了数据、list、vector等,会对Go的切片slice不习惯,下面整理出go中slice...

揭秘 Go 切片(Slice)的秘密

当向切片添加新参数时,底层数组会发生什么变化?它会扩展以容纳更多元素吗?在这篇文章中,我们将深入探讨切片的内部工作原理,以及如何利用这些知识来进行更好的内存管理和性能优化。具体而言,我们将探索Go...

【Go语言slice详解】深入掌握Go语言中的slice类型及常用操作!

Go语言中的slice(切片)是一种非常方便的数据结构,可以动态地增加或减少其元素数量,且可以访问底层数组的任意一个子序列。本文将对Go语言中的slice进行详细的讲解。Slice的定义在Go语言中,...

掌握GO中的Slice,这就够了

最近Golang越来越火,不少小伙伴都纷纷开始学习Golang,但对于原先为C++或者JAVA的同学,用习惯了数据、list、vector等,会对Go的切片slice不习惯,下面整理出go中slice...

golang2021面向对象(26)Go语言类型内嵌和结构体内嵌

结构体可以包含一个或多个匿名(或内嵌)字段,即这些字段没有显式的名字,只有字段的类型是必须的,此时类型也就是字段的名字。匿名字段本身可以是一个结构体类型,即结构体可以包含内嵌结构体。?可以粗略地将这个...

2022-11-13:以下go语言代码中,如何获取结构体列表以及结构体内

2022-11-13:以下go语言代码中,如何获取结构体列表以及结构体内的指针方法列表?以下代码应该返回{"S1":["M1","M2"],"S...

Go语言文件和目录操作

文件和目录操作概述一、文件和目录操作概述在计算机中,文件和目录是存储数据的重要方式。在Go语言中,我们可以使用os和io/ioutil包提供的函数和结构体来进行文件和目录操作。本文将详细介绍Go语言中...

跟我一起学习go语言(五)golang中结构体的初始化方法

1、自定义一个结构体typeVertexstruct{X,Yfloat64}2、初始化方法-指针:rect1:=new(Vertex)rect2:=&Vertex...

Go复合数据类型:结构体

一种通用的、对实体对象进行聚合抽象的能力,在Go中,提供这种聚合抽象能力的类型是结构体类型,也就是struct。自定义一个新类型在Go中,我们自定义一个新类型一般有两种方法。第一种是类型定义...

Go语言基础:方法

导读在阅读本文章前,假定你具备如下能力:?已掌握结构体1.方法1.1方法的概念在理解程序中方法的概念时,我们先看看现实中的一些情况,这样相对比较好理解一些。在农村的朋友可能会知道,在医疗落后的情况...

为什么 Go 语言 struct 要使用 tags

在Go语言中,struct是一种常见的数据类型,它可以用来表示复杂的数据结构。在struct中,我们可以定义多个字段,每个字段可以有不同的类型和名称。除了这些基本信息之外,Go还提供了s...

一文带你掌握掌握 Golang结构体与方法

1.Golang结构体的概念及定义结构体是Golang中一种复合类型,它是由一组具有相同或不同类型的数据字段组成的数据结构。结构体是一种用户自定义类型,它可以被用来封装多个字段,从而实现数据的...

取消回复欢迎 发表评论: