Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
go语言设计模式18讲.pdf
Search
bin Chou
April 24, 2023
2
460
go语言设计模式18讲.pdf
bin Chou
April 24, 2023
Tweet
Share
More Decks by bin Chou
See All by bin Chou
冒泡排序
mouuii
0
2
选择
mouuii
0
3
递归
mouuii
0
1
归并
mouuii
0
2
k8s源码从头学11课
mouuii
0
25
Featured
See All Featured
Embracing the Ebb and Flow
colly
84
4.5k
KATA
mclloyd
29
14k
Stop Working from a Prison Cell
hatefulcrawdad
267
20k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
44
9.3k
Navigating Team Friction
lara
183
15k
The Language of Interfaces
destraynor
154
24k
Building a Modern Day E-commerce SEO Strategy
aleyda
38
7k
GraphQLの誤解/rethinking-graphql
sonatard
67
10k
BBQ
matthewcrist
85
9.4k
Building Adaptive Systems
keathley
38
2.3k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
2
290
How STYLIGHT went responsive
nonsquared
95
5.2k
Transcript
go语言设计模式 18讲 南哥
南哥 云原生架构师 开源项目nocalhost、zadig 维护者,k8s 贡献者 云原生架构师,对于devops有深刻理解 CIT中国社区创始人
课程目录 一、创建型模式 1.单例模式 2.简单工厂 3.抽象工厂 4.建造者模式 5.配置模式 6.原型模式 二、结构型模式 7.适配器模式
8.桥接模式 9.对象树模式
课程目标 10.装饰器模式 11.管道模式 12.插件模式 三、行为模式 13.链式调用 14.责任链模式 15.观察者模式 16.缓存代理 17.策略模式
18.模板方法
创建型模式
单例模式
单例(Singleton)模式的定义: 顾名思义,指的就是一个类只能生成一个实例,且该类能自行创建这个实例的一种模式。 在服务的生命周期内,一个类生成的一个实例对象只能存在一个,调用时复用该单例对象即可, 这样既节省了内存空间,也节省了创建新对象时的资源消耗,也便于资源管理。 在日常开发中,很多场景其实都可以被设计成单例,像线程池,全局日志,数据库等等,单例模式总结 下来有几个特点: - 单例类只有一个实例对象; - 该单例对象必须由单例类自行创建;
- 单例类对外提供一个访问该单例的全局访问点 下面是一个简单的示例代码: 单例模式
案例 全局唯一的Singleton
简单工厂 第二节
简单工厂模式(Simple Factory Pattern)的定义: 简单工厂模式是一种对象创建型模式,它定义了一个工厂类,用于创建不同类型的对象。简单 来说,简单工厂模式就是将对象的创建过程封装起来,使得客户端可以通过一个工厂类来创建 不同类型的对象,而无需知道具体的创建过程。 在 Go 中实现简单工厂,通常需要定义一个工厂方法来创建不同类型的对象。这个工厂方法通 常是一个静态方法,它接收一个参数来指定要创建的对象类型,并返回一个实例化的对象。
本节带大家一起走进golang设计模式之简单工厂,下面是一个简单的示例代码: 简单工厂
案例 一个能够生产两种产品的工厂
抽象工厂 第三节
抽象工厂模式(Abstract Factory Pattern)的定义: 是一种创建型设计模式,它提供了一种在不指定具体类的情况下创建一系列相关或相互依赖的 对象的接口。抽象工厂允许你根据需求切换不同的具体工厂实现,以便在运行时根据配置或其 他条件创建适当的对象。 简单来说,抽象工厂模式就是将多个工厂类的接口进行抽象,然后再用一个工厂类来封装这些 工厂类的接口。在创建具体对象时,我们通常需要使用其他对象或者数据结构,因此我们还需 要定义一些相关的产品接口和产品结构体。 本节带大家一起走进golang设计模式之抽象工厂,下面是一个简单的示例代码:
抽象工厂
案例 2个能生产button和checkbox的工厂
案例 2个能生产button和checkbox的工厂
建造者模式 第四节
建造者模式(Builder Pattern)的定义: 是一种对象创建型模式,它可以将复杂对象的构建过程与表示分离开来,使得相同的构建过程 可以创建不同的表示。简单来说,建造者模式就是将一个复杂对象的创建过程封装起来,使得 这个过程可以有不同的表示方式。 在 Go 中实现建造者模式,通常需要定义一个产品类和一个建造者类。产品类用于表示最终要 创建的复杂对象,建造者类用于封装创建产品对象的过程,这个过程通常分成多个步骤进行, 每个步骤都由一个具体的建造者来负责实现。最后,我们还可以定义一个
Director 类,用于调 用建造者的方法来创建产品。这样,我们就可以通过一个 Director 对象来控制产品对象的创建 过程,同时也可以根据需要选择不同的建造者来创建不同的表示。 本节带大家一起走进golang设计模式之建造者模式,下面是一个简单的示例代码: 建造者模式
案例 使用建造者建造产品
配置模式 第五节
配置模式(Configuration Pattern)的定义: 它用于将应用程序的配置数据从代码中分离出来,以便可以更容易地进行修改和管理。配置数 据可以包括各种设置,例如数据库连接字符串、日志级别、缓存大小等等。通过使用配置模式, 我们可以将这些数据从代码中提取出来,放在一个独立的配置文件中,以便进行统一管理和修 改。 在配置模式中,我们通常会定义一个 Config 结构体来表示应用程序的配置数据,该结构体包 含了一系列的属性和方法,用于获取和设置各种配置项的值。我们也可以使用其他的数据结构
来表示配置数据,例如 map、json、yaml 等等。 本节带大家一起走进golang设计模式之配置模式,下面是一个简单的示例代码: 配置模式
案例 配置模式初级
案例 配置模式高级
原型模式 第六节
原型的定义: 原型模式是一种创建型设计模式,它允许通过克隆现有对象来创建新对象,而无需通过实例化 和配置新对象来完成。在原型模式中,我们创建一个原型对象,然后通过复制该对象来创建新 的对象,而不是使用常规的构造函数和初始化流程。 在 Golang 中,原型模式的实现需要满足以下要素: • 定义一个原型对象,该对象实现了 Clone()
方法,用于克隆自身并返回新的克隆对象。 • 定义一个工厂函数或方法,用于创建原型对象并初始化其属性。 • 客户端代码可以通过调用原型对象的 Clone() 方法来创建新的对象,而不是直接调用构造函 数或工厂函数。 本节带大家一起走进golang设计模式之原型模式,下面是一个简单的示例代码: 原型模式
案例 原型模式
结构型模式 第二章
适配器模式 第七节
适配器模式的定义: 适配器模式是一种结构型设计模式,用于将不兼容的接口转换为客户端所期望的另一种接口。 在适配器模式中,适配器作为一个中间层,将客户端所期望的接口转换为被适配者的接口。适 配器能够使得原本无法兼容的接口之间可以进行交互。 适配器模式有两种实现方式:类适配器和对象适配器。类适配器使用继承实现适配器,而对象 适配器使用组合实现适配器。在Golang中,由于Golang不支持继承,因此适配器模式通常使 用对象适配器实现。 本节带大家一起走进golang设计模式之适配器模式,下面是一个简单的示例代码: 适配器模式
案例 适配器模式
桥接模式 第八节
桥接模式的定义: 桥接模式(Bridge Pattern)是一种结构型设计模式,它将抽象与实现分离,以便它们可以独 立地变化。这种模式的关键思想是使用组合而不是继承来组织代码。在Go语言(Golang)中, 可以通过接口和结构体实现桥接模式。 本节带大家一起走进golang设计模式之桥接模式,下面是一个简单的示例代码: 桥接模式
案例 画图
案例 画图
桥接模式的优点: 1.抽象与实现解耦:桥接模式允许你将抽象部分(如形状)与实现部分(如颜色)分离,这意味 着你可以独立地改进和扩展它们。这为代码的演进和重构提供了更大的灵活性。 2.提高可扩展性:桥接模式使得在不修改原有代码的情况下,为现有的抽象和实现添加新功能变 得更加容易。例如,在上面的示例中,如果你想添加一个新的形状(如三角形)或颜色(如绿 色),只需创建相应的新实现类即可。 3.更好地遵循开放封闭原则:桥接模式遵循了开放封闭原则,即对扩展开放,对修改封闭。这意 味着你可以轻松地扩展系统,而无需更改现有代码。这有助于减少引入错误的风险,同时提高 了代码的可维护性。 桥接模式
对象树模式 第九节
对象树模式的优点: 在Go语言(Golang)中,对象树模式表示一种实用的数据结构,可以表示层次结构和树状关 系。这种结构在许多场景中都很有用,比如表示文件系统、组织结构、网站导航菜单等 本节带大家一起走进golang设计模式之对象树模式,下面是一个简单的示例代码: 对象树模式
案例 对象树
对象树模式的优点: 1.易于表示层次结构:对象树模式非常适合表示具有层次结构和树状关系的数据。它可以很容易 地表示组织结构、文件系统、网站导航菜单等场景。 2.易于遍历和操作:对象树模式提供了一种结构化的方式来遍历和操作树状数据。可以方便地对 树中的节点进行查找、插入、删除等操作。 3.模块化和可扩展性:对象树模式可以轻松地将节点的功能和数据分离,使得节点的实现可以独 立于树的结构。这为代码的可扩展性和可维护性提供了基础。 对象树模式
装饰器模式 第十节
装饰器模式的定义: 装饰器模式(Decorator Pattern)是一种结构型设计模式,它允许在运行时动态地为对象添加 新的行为,而不改变原始对象的代码。在Go语言中,装饰器模式可以通过闭包和高阶函数实现。 本节带大家一起走进golang设计模式之装饰器模式,下面是一个简单的示例代码: 装饰器模式
案例 装饰器
案例 装饰器
装饰器模式的优点: 1.灵活性:装饰器模式允许在运行时动态地为对象添加新的行为,而无需修改原始对象的代码。 这使得我们可以在不影响现有代码的情况下,根据需求灵活地扩展功能。 2.易于维护:由于装饰器模式将不同的功能扩展分散到了不同的装饰器中,每个装饰器都负责一 个具体的功能,这使得代码更加模块化,易于理解和维护。 3.代码重用:装饰器模式允许我们将通用的功能封装到独立的装饰器中,以便在多个组件或应用 中重用。这可以提高代码的重用性,降低开发成本 装饰器模式
管道模式 第十一节
管道模式的定义: 管道模式(Pipeline Pattern)通过将一系列处理步骤组合成一个处理流水线来处理数据。在 Go语言中,管道模式可以借助Go的强大的并发特性和channel来实现。 本节带大家一起走进golang设计模式之管道模式,下面是一个简单的示例代码: 管道模式
案例 管道
管道模式的优点: 1.易于理解:管道模式将复杂的处理流程拆分为一系列简单的处理步骤,使得代码更容易理解。 每个处理步骤都是独立的、可重用的,有助于降低代码的复杂度。 2.模块化和可扩展性:管道模式将处理流程划分为一系列独立的模块,这些模块可以灵活地组合 以满足不同的需求。在需要扩展功能时,可以很容易地将新的处理步骤添加到现有的管道中。 3.高并发性能:借助Go的强大并发特性,管道模式可以充分利用多核处理器资源,实现高效的 数据处理。通过goroutine和channel,我们可以简化并发代码的编写,提高程序的执行效率。 管道模式
插件模式 第十二节
插件模式的定义: 插件模式一般用来集成一些具有能力的外部组件,通过制定接口标准,来集成外部能力 在go语言中,一些可拓展能力需要第三方实现的时候,我们经常用到这种模式 本节带大家一起走进golang设计模式之插件模式,下面是一个简单的示例代码: 插件模式
案例 云厂商接入
插件模式的优点: 1.可扩展性:插件模式允许在不修改主程序代码的情况下添加新功能。这意味着主程序可以在运 行时动态加载和卸载插件,提高了应用程序的可扩展性和灵活性。 2.模块化:插件模式将程序分解为独立的模块,每个模块可以单独开发、测试和维护。这种模块 化设计有助于降低复杂度,提高代码可读性和可维护性。 3.隔离性:插件模式可以将不同功能的实现分离到单独的插件中,这样可以隔离潜在的错误和问 题,减少故障的影响范围。此外,插件的开发、测试和部署可以独立于主程序进行,使开发过 程更加高效。 插件模式
行为模式 第三章
链式调用模式 第十三节
链式调用模式的定义: 链式调用(也称为Fluent Interface)是一种编程技巧,它可以提高代码的可读性和易用性。 在Go语言中,我们可以通过在方法上返回当前对象的引用实现链式调用。这允许我们将多个方 法调用链接在一起,形成一个连贯的表达式。 本节带大家一起走进golang设计模式之链式调用模式,下面是一个简单的示例代码: 链式调用模式
案例 链式调用
链式调用模式的优点: 1.可读性:链式调用使代码看起来更自然、流畅,有助于提高代码的可读性。通过将多个方法调 用组合在一起,可以减少代码的重复和嵌套,使代码更易于阅读和理解。 2.简洁性:链式调用可以减少代码量,使代码更加简洁。方法调用可以紧密地链接在一起,避免 了不必要的临时变量和额外的语句。 3.易用性:链式调用提供了一种更自然的方式来配置和操作对象。它允许开发者以一种声明式的 方式来表达他们的意图,而不需要关心底层实现的细节。 4.灵活性:链式调用可以更容易地创建和修改对象。通过将方法链接在一起,可以方便地调整对 象的属性,而无需重新组织或重写代码。 链式调用模式
责任链模式 第十四节
责任链模式的定义: 责任链模式(Chain of Responsibility)是一种设计模式,它允许多个对象来处理请求,这些 对象形成一个链,请求沿着这个链传递,直到有一个对象处理它。这种模式可以降低请求发送 者和接收者之间的耦合度,同时提高了程序的灵活性。 本节带大家一起走进golang设计模式之责任链模式,下面是一个简单的示例代码: 责任链模式
案例 处理器
案例 处理器
责任链模式的优点: 1.降低耦合度:责任链模式可以降低请求发送者和接收者之间的耦合度。发送者仅需要知道如何 将请求发送到链中的第一个处理器,而无需关心请求的处理细节和接收者的身份。这有助于简 化系统的结构,提高代码的可维护性。 2.灵活性:责任链模式允许在运行时动态地添加、移除或重新排列处理器。这使得处理器链可以 根据需要灵活地处理不同类型的请求,提高了系统的扩展性和适应性。 3.易于扩展:责任链模式易于添加新的处理器。当需要支持新类型的请求时,只需实现一个新的 处理器并将其添加到链中,而无需修改现有代码 责任链模式
观察者模式 第十五节
观察者模式的定义: 观察者模式(Observer Pattern)是一种行为设计模式,它定义了一种一对多的依赖关系,当 一个对象(被观察者)的状态发生改变时,所有依赖于它的对象(观察者)都会得到通知并自 动更新。观察者模式用于实现事件驱动架构,它可以有效地解耦对象之间的关系,提高系统的 可扩展性和灵活性 本节带大家一起走进golang设计模式之观察者模式,下面是一个简单的示例代码: 观察者模式
案例 观察者
案例 观察者
观察者模式的优点: 1.解耦:观察者模式有助于解耦被观察者和观察者之间的关系。它们之间仅通过抽象的接口进行 通信,这样可以降低它们之间的依赖性。这使得被观察者可以独立地发生变化,而不影响观察 者的实现。 2.广播通知:观察者模式支持广播通知,即当被观察者的状态发生改变时,可以通知所有已注册 的观察者。这可以使得多个观察者同时响应某个事件,提高系统的响应能力。 3.支持事件驱动:观察者模式是实现事件驱动架构的基础。通过观察者模式,可以将系统中的事 件和事件处理器分离,使得事件处理更加灵活、模块化。 观察者模式
缓存代理模式 第十六节
缓存代理模式的定义: 缓存代理可以存储被代理对象的操作结果,并在后续请求中重用这些结果,以提高系统性能和 响应速度。这种模式在访问成本较高的服务(如远程服务、数据库查询等)时特别有用。 本节带大家一起走进golang设计模式之缓存代理模式,下面是一个简单的示例代码: 缓存代理模式
案例 缓存代理
案例 缓存代理
缓存代理模式的优点: 1.提高性能:通过将计算或查询的结果存储在缓存中并在后续请求中重用,缓存代理模式可以减 少对实际服务提供者的访问次数,从而提高系统性能和响应速度。 2.减轻资源负担:缓存代理模式可以减轻被代理对象的负担,例如,减少数据库查询的次数、降 低网络带宽的占用等。这可以帮助节省计算资源、网络资源和存储资源。 3.保护被代理对象:缓存代理模式可以为被代理对象提供一定程度的保护。例如,缓存代理可以 限制对敏感数据的访问、过滤恶意请求等。 缓存代理模式
策略模式 第十七节
策略模式的定义: 策略模式是一种行为设计模式,它定义了一系列算法,并将每一个算法封装起来,使它们可以 相互替换。策略模式让算法独立于使用它的客户端。在Go语言中,我们可以使用接口来实现策 略模式。 本节带大家一起走进golang设计模式之策略模式,下面是一个简单的示例代码: 策略模式
案例 多策略
案例 多策略
策略模式的优点: 1.易于扩展:策略模式将算法封装在具体策略类中,这使得添加新策略变得非常容易。只需实现 一个新的策略类,然后在客户端使用时将其传递给上下文对象即可。 2.松耦合:策略模式将算法的实现与其使用分离开来。客户端通过策略接口与具体策略解耦,这 使得不同的算法可以在不修改客户端代码的情况下进行替换。 3.代码复用:策略模式将相互独立的算法封装在不同的策略类中,使得这些算法可以在多个场景 中复用。通过将算法封装在策略类中,可以避免在客户端代码中重复实现相同的逻辑。 4.提高可维护性:策略模式可以将复杂的逻辑划分为多个策略类,从而使每个策略类的职责更加 单一 策略模式
模版方法 第十八节
模版方法的定义: 模板方法模式是一种行为设计模式,它在抽象类中定义了一个操作中的算法的骨架(模板), 但将一些步骤延迟到子类中实现。这允许子类在不改变算法结构的情况下重定义某些步骤。在 Go语言中,我们可以使用接口和方法组合来实现模板方法模式。 本节带大家一起走进golang设计模式之模版方法模式,下面是一个简单的示例代码: 模版方法模式
案例 游戏
案例 游戏
模版方法的优点: 1.封装变化:模板方法模式将可变部分(即子类中实现的具体步骤)与不变部分(即算法骨架) 分离,这有助于将变化的影响限制在子类中,提高了代码的可维护性。 2.便于控制和增强:模板方法模式允许父类对子类实现的步骤施加控制。例如,可以在父类的模 板方法中添加前置/后置操作,从而实现对子类的行为进行增强或约束。 模版方法模式
课程总结 在这门Go语言设计模式课程中,我们讨论了许多常见的设计模式,包括创建型、结构型和行为 型模式。 创建型模式:这些模式涉及到对象的创建。它们提供了一种在不指定具体类的情况下创建对象 的方法。 结构型模式:这些模式涉及到类和对象的组合。它们在保持各个类的独立性的基础上实现类和 对象之间的协作。 行为型模式:这些模式定义了对象之间的交互和通信。 3大模式
课程总结 在学完Go语言设计模式课程后,您可以将所学知识应用于以下方面: 实际项目开发:在实际项目中应用设计模式,提高代码质量和可维护性。这将有助于降低软件 的维护成本,提高开发效率。 参与开源项目:您可以将所学的设计模式应用于开源项目中,为项目做出贡献。参与开源项目 不仅可以提高您的技能,还能拓展您的职业网络。 应用
THANKS