
本书聚焦于Go语言设计模式的知识与应用。全书共6章,分别为设计模式入门、创建型设计模式、结构型设计模式、行为型设计模式、设计模式扩展、设计模式与软件架构。本书简洁而不失技术深度,内容覆盖Go语言的主流设计模式和软件架构,以极简的文字介绍了复杂的案例,是学习Go语言设计模式和软件架构的实用教程。
Go语言是Google于2009年开源的系统编程语言,可以在不损失应用程序性能的情况下,极大地降低代码的复杂性,其特点是简洁、快速、安全、并行、有趣、开源、数组安全、编译迅速。 Go语言在高性能分布式系统、Web服务器编程、分布式系统开发、云平台开发、区块链开发等领域得到了广泛应用。 近几年,很多公司,特别是云计算公司开始使用Go语言重构其基础架构,并且直接使用Go语言进行应用程序开发。Docker、Kubernetes等重量级应用程序的持续火热,使Go语言成为当下最热门的编程语言之一。 ★★ 为什么需要使用设计模式 设计模式是经过长期实践检验的解决方案,提供了丰富的软件范例和代码模板,可以帮助软件开发者加快开发速度、解决代码问题、提升代码的可读性。 设计模式可以根据以前的实践和经验记录要采用的解决方案。在设计模式的实现中,需要使用多个软件组件共同实现某些功能。因此,设计模式涉及多个软件组件的开发过程。 软件开发者通常会根据多个标准评估现有代码,包括代码的干净程度、表现力、内存资源占用量和运行速度。设计模式有助于将创造性设计方法应用于特定问题。使用设计模式的主要原因如下。 (1)设计模式是经过长期实践检验的解决方案,开发者可以放心使用。 (2)设计模式很容易重复使用。设计模式定义了一个可重用的解决方案,可以定制,以便适应各种挑战。 (3)设计模式富有表现力,使用设计模式可以优雅地解释大型解决方案。 (4)设计模式简化了沟通,熟悉设计模式的开发者可以更轻松地就设计问题的潜在答案进行协作。 (5)设计模式降低了对重构代码的需求。假设一个应用程序是使用设计模式创建的,那么开发者以后可能不需要频繁地修改代码,因为将正确的设计模式应用于特定问题通常是最好的解决方案。 综上所述,设计模式可以让开发者避免重新发明轮子,提高开发者的工作效率。设计模式还提供了一种有用的通用语言,用于在与他人讨论或在更大的团队中管理代码时概念化重复的问题和解决方案。 ★★ 为什么写本书 近几年,Go语言逐渐成为当下最热门的编程语言之一,越来越多的开发者开始使用Go语言进行软件架构设计,而软件架构设计是软件开发中非常重要的步骤。软件架构与建筑架构类似。如果没有做好建筑架构,那么房屋可能会坍塌。同理,如果没有做好软件架构,那么软件可能会在后期崩溃。所以,作为软件开发者或软件架构师,掌握设计模式和软件架构非常重要。 目前网络上有一些关于设计模式的代码和文档,但基本都是零碎的知识,对设计模式的描述也不够详细,没有系统地对Go语言设计模式进行讲解。这对想系统地学习Go语言设计模式的开发者来说,会浪费大量的时间。与此同时,目前国内还没有关于Go语言设计模式的书,特别是关于Go语言设计模式与软件架构的高级开发知识和技巧的书。所以笔者想结合多年的Go语言软件开发经验,写一本关于Go语言设计模式的书,希望给更多的初学者带来帮助。于是,2021年下半年我便在工作之余开启了本书的写作之旅。 ★★本书特色 笔者结合多年的Go语言编程实践经验,对Go语言设计模式和软件架构的相关知识进行了全面、深入的讲解。本书的特色如下。 (1)一线技术,突出实战。本书以实战为核心,每个设计模式都有详细的实现方式和实战代码,所有代码都采用笔者写书时最新的Go语言版本(1.18)编写。 (2)零基础入门,循序渐进。本书首先讲解设计模式入门,然后讲解设计模式的基本概念,再讲解Go语言设计模式的具体实现,最后讲解设计模式的项目实战,帮助初学者向Go语言设计模式和软件架构实战高手迈进。 (3)丰富图示,更易理解。本书言简意赅,以帮助读者提升开发效率为导向。每个设计模式都有UML类图,通过丰富的图示,帮助读者缩短阅读本书的时间。 (4)突出实战,快速突击。本书的实战代码大部分都来自最新的企业实战项目。对于购买本书的读者,配套的源代码可以在网上下载,下载即可运行,让读者通过实践加深理解。 (5)实战方案可以二次开发,用于进行实战部署。本书以实战为主,所有的实战代码都可以直接运行。特别是第6章, 购买本书的读者可以获得Go语言主流软件架构的全部源代码。 技术交流 假如读者在阅读本书的过程中有任何疑问,那么请关注“源码大数据”公众号,并且按照提示输入问题,笔者会第一时间与读者进行交流。 感谢Go语言社区的所有贡献者,没有他们多年来的贡献,就没有Go语言社区的繁荣。谨以此书献给所有喜欢Go语言设计模式的朋友们。 感谢我的家人,特别是妻子。在我写作期间,妻子悉心做好幕后工作,并且坚定地支持我,使我有更多时间、更加专注而坚定地写作。 廖显东 2022年8月
第1章 设计模式入门 / 1 1.1 设计模式介绍 / 1 1.1.1 初识设计模式 / 1 1.1.2 怎样使用设计模式 / 2 1.2 UML基础知识 / 3 1.2.1 什么是UML / 3 1.2.2 UML事物 / 6 1.2.3 UML关系 / 8 1.2.4 UML图 / 9 1.3 设计模式的六大原则 / 19 1.4 回顾与启示 / 21 第2章 创建型设计模式 / 22 2.1 单例模式 / 22 2.1.1 单例模式简介 / 22 2.1.2 Go语言实战 / 26 2.1.3 优缺点分析 / 27 2.2 工厂方法模式 / 28 2.2.1 工厂方法模式简介 / 28 2.2.2 Go语言实战 / 30 2.2.3 优缺点分析 / 34 2.3 抽象工厂模式 / 35 2.3.1 抽象工厂模式简介 / 35 2.3.2 Go语言实战 / 37 2.3.3 优缺点分析 / 43 2.4 生成器模式 / 44 2.4.1 生成器模式简介 / 44 2.4.2 Go语言实战 / 47 2.4.3 优缺点分析 / 51 2.5 原型模式 / 52 2.5.1 原型模式简介 / 52 2.5.2 Go语言实战 / 54 2.5.3 优缺点分析 / 57 2.6 对象池模式 / 58 2.6.1 对象池模式简介 / 58 2.6.2 Go语言实战 / 61 2.6.3 优缺点分析 / 64 2.7 回顾与启示 / 65 第3章 结构型设计模式 / 66 3.1 组合模式 / 66 3.1.1 组合模式简介 / 66 3.1.2 Go语言实战 / 70 3.1.3 优缺点分析 / 73 3.2 适配器模式 / 73 3.2.1 适配器模式简介 / 73 3.2.2 Go语言实战 / 78 3.2.3 优缺点分析 / 80 3.3 桥接模式 / 81 3.3.1 桥接模式简介 / 81 3.3.2 Go语言实战 / 85 3.3.3 优缺点分析 / 88 3.4 装饰器模式 / 89 3.4.1 装饰器模式简介 / 89 3.4.2 Go语言实战 / 93 3.4.3 优缺点分析 / 95 3.5 外观模式 / 96 3.5.1 外观模式简介 / 96 3.5.2 Go语言实战 / 99 3.5.3 优缺点分析 / 104 3.6 享元模式 / 105 3.6.1 享元模式简介 / 105 3.6.2 Go语言实战 / 108 3.6.3 优缺点分析 / 112 3.7 代理模式 / 113 3.7.1 代理模式简介 / 113 3.7.2 Go语言实战 / 116 3.7.3 优缺点分析 / 119 3.8 回顾与启示 / 120 第4章 行为型设计模式 / 121 4.1 策略模式 / 121 4.1.1 策略模式简介 / 121 4.1.2 Go语言实战 / 124 4.1.3 优缺点分析 / 128 4.2 责任链模式 / 129 4.2.1 责任链模式简介 / 129 4.2.2 Go语言实战 / 132 4.2.3 优缺点分析 / 136 4.3 命令模式 / 137 4.3.1 命令模式简介 / 137 4.3.2 Go语言实战 / 141 4.3.3 优缺点分析 / 144 4.4 迭代器模式 / 144 4.4.1 迭代器模式简介 / 144 4.4.2 Go语言实战 / 148 4.4.3 优缺点分析 / 151 4.5 中介者模式 / 151 4.5.1 中介者模式简介 / 151 4.5.2 Go语言实战 / 155 4.5.3 优缺点分析 / 159 4.6 备忘录模式 / 160 4.6.1 备忘录模式简介 / 160 4.6.2 Go语言实战 / 163 4.6.3 优缺点分析 / 166 4.7 观察者模式 / 167 4.7.1 观察者模式简介 / 167 4.7.2 Go语言实战 / 170 4.7.3 优缺点分析 / 173 4.8 状态模式 / 174 4.8.1 状态模式简介 / 174 4.8.2 Go语言实战 / 177 4.8.3 优缺点分析 / 181 4.9 模板方法模式 / 181 4.9.1 模板方法模式简介 / 181 4.9.2 Go语言实战 / 185 4.9.3 优缺点分析 / 188 4.10 访问者模式 / 188 4.10.1 访问者模式简介 / 188 4.10.2 Go语言实战 / 193 4.10.3 优缺点分析 / 198 4.11 回顾与启示 / 198 第5章 设计模式扩展 / 199 5.1 空对象模式 / 199 5.1.1 空对象模式简介 / 199 5.1.2 Go语言实战 / 202 5.1.3 优缺点分析 / 205 5.2 规格模式 / 205 5.2.1 规格模式简介 / 205 5.2.2 Go语言实战 / 210 5.2.3 优缺点分析 / 215 5.3 领域驱动设计 / 215 5.3.1 领域驱动设计简介 / 215 5.3.2 Go语言实战 / 225 5.3.3 优缺点分析 / 239 5.4 回顾与启示 / 239 第6章 设计模式与软件架构 / 240 6.1 软件架构 / 240 6.1.1 软件架构简介 / 240 6.1.2 软件架构与设计模式的区别 / 243 6.1.3 如何选择软件架构 / 246 6.2 MVC架构 / 247 6.2.1 MVC架构简介 / 247 6.2.2 Go语言实战 / 249 6.2.3 优缺点分析 / 255 6.3 RPC架构 / 256 6.3.1 RPC架构简介 / 256 6.3.2 Go语言实战 / 257 6.3.3 优缺点分析 / 265 6.4 三层架构 / 266 6.4.1 三层架构简介 / 266 6.4.2 Go语言实战 / 267 6.4.3 优缺点分析 / 277 6.5 微服务架构 / 278 6.5.1 微服务架构简介 / 278 6.5.2 Go语言实战 / 281 6.5.3 优缺点分析 / 289 6.6 事件驱动架构 / 291 6.6.1 事件驱动架构简介 / 291 6.6.2 Go语言实战 / 292 6.6.3 优缺点分析 / 299 6.7 回顾与启示 / 300