1. 概述
最近看了一些关于设计模式的文章,之前其实也断断续续学过一点设计模式的知识,但是在实际开发工作中用的比较少,缺少实践经验,因此最近重新开始系统性的学习下设计模式,并使用 Golang 进行代码编写。
本系统文章中关于设计模式的内容大多来源于 Refactoring.Guru ,这个网站关于设计模式的电子书讲解的很不错,插图也很贴切,并且提供了多个版本的电子书格式以及多个语言的示例代码,很值得一看。
我在本系列文章的代码都存储于 Github 。
以下内容节选自 Refactoring.Guru 。
2. 常见问题
2.1 设计模式是什么?
设计模式是软件设计中常见问题的典型解决方案。 它们就像能根据需求进行调整的预制蓝图, 可用于解决代码中反复出现的设计问题。
设计模式与方法或库的使用方式不同, 你很难直接在自己的程序中套用某个设计模式。 模式并不是一段特定的代码, 而是解决特定问题的一般性概念。 你可以根据模式来实现符合自己程序实际所需的解决方案。
人们常常会混淆模式和算法, 因为两者在概念上都是已知特定问题的典型解决方案。 但算法总是明确定义达成特定目标所需的一系列步骤, 而模式则是对解决方案的更高层次描述。 同一模式在两个不同程序中的实现代码可能会不一样。
算法更像是菜谱: 提供达成目标的明确步骤。 而模式更像是蓝图: 你可以看到最终的结果和模式的功能, 但需要自己确定实现步骤。
2.2 模式包含哪些内容?
大部分模式都有正规的描述方式, 以便在不同情况下使用。 模式的描述通常会包括以下部分:
- 意图部分简单描述问题和解决方案。
- 动机部分将进一步解释问题并说明模式会如何提供解决方案。
- 结构部分展示模式的每个部分和它们之间的关系。
- 在不同语言中的实现提供流行编程语言的代码, 让读者更好地理解模式背后的思想。
部分模式介绍中还列出其他的一些实用细节, 例如模式的适用性、 实现步骤以及与其他模式的关系。
2.3 为什么以及如何学习设计模式?
或许你已从事程序开发工作多年, 却完全不知道单例模式是什么。 很多人都是这样。 即便如此, 你可能也在不自知的情况下已经使用过一些设计模式了。 所以为什么不花些时间来更进一步学习它们呢?
- 设计模式是针对软件设计中常见问题的工具箱, 其中的工具就是各种经过实践验证的解决方案。 即使你从未遇到过这些问题, 了解模式仍然非常有用, 因为它能指导你如何使用面向对象的设计原则来解决各种问题。
- 设计模式定义了一种让你和团队成员能够更高效沟通的通用语言。 你只需说 “哦, 这里用单例就可以了”, 所有人都会理解这条建议背后的想法。 只要知晓模式及其名称, 你就无需解释什么是单例。
2.4 为什么你需要了解模式?
了解模式能帮助你轻松应对面试和考核。 几乎所有关于编程的工作面试和考核中都会有关于模式的问题。 了解这些知识能够帮助你发现更广泛的工作机会, 或者实现升职加薪的工作目标。
了解模式可扩展你的编程工具箱。 模式能让你对已有的解决方案进行自定义, 而不用完全自行开发。 代码中的错误将更少, 因为你使用的是经过证明的标准解决方案, 它考虑了所有隐藏的问题。
了解模式让你能够更好地与同事沟通。 你只需将模式的名称告诉给程序员, 而不需要长篇累牍地解释自己那绝妙的设计思想以及其中各个类的作用。 不费吹灰之力就能搞定同事之间的沟通。
2.5 设计模式分类
不同设计模式的复杂程度、 细节层次以及在整个系统中的应用范围等方面各不相同。 我喜欢将其类比于道路的建造: 如果你希望让十字路口更加安全, 那么可以安装一些交通信号灯, 或者修建包含行人地下通道在内的多层互通式立交桥。
最基础的、 底层的模式通常被称为惯用技巧。 这类模式一般只能在一种编程语言中使用。
最通用的、 高层的模式是构架模式。 开发者可以在任何编程语言中使用这类模式。 与其他模式不同, 它们可用于整个应用程序的架构设计。
此外, 所有模式可以根据其意图或目的来分类。 本书覆盖了三种主要的模式类别:
- 创建型模式提供创建对象的机制, 增加已有代码的灵活性和可复用性。
- 结构型模式介绍如何将对象和类组装成较大的结构, 并同时保持结构的灵活和高效。
- 行为模式负责对象间的高效沟通和职责委派。
2.6 常用设计模式有哪些?
3. 当前完成进度
序号 | 类型 | 模式 | 英文 | 文档 | 完成 |
---|---|---|---|---|---|
01 | 创建型 | 工厂模式 | Factory Pattern | Doc | ✅ |
02 | 创建型 | 抽象工厂模式 | Abstract Factory Pattern | Doc | ✅ |
03 | 创建型 | 单例模式 | Singleton Pattern | Doc | ✅ |
04 | 创建型 | 建造者模式 | Builder Pattern | Doc | ✅ |
05 | 创建型 | 原型模式 | Prototype Pattern | Doc | ✅ |
06 | 结构型 | 适配器模式 | Adapter Pattern | Doc | ✅ |
07 | 结构型 | 桥接模式 | Bridge Pattern | Doc | ✅ |
08 | 结构型 | 组合模式 | Composite Pattern | Doc | ✅ |
09 | 结构型 | 装饰模式 | Decorator Pattern | Doc | ✅ |
10 | 结构型 | 外观模式 | Facade Pattern | Doc | |
11 | 结构型 | 享元模式 | Flyweight Pattern | Doc | |
12 | 结构型 | 代理模式 | Proxy Pattern | Doc | |
13 | 行为型 | 责任链模式 | Chain of Responsibility Pattern | Doc | |
14 | 行为型 | 命令模式 | Command Pattern | Doc | |
15 | 行为型 | 迭代器模式 | Iterator Pattern | Doc | |
16 | 行为型 | 中介者模式 | Mediator Pattern | Doc | |
17 | 行为型 | 备忘录模式 | Memento Pattern | Doc | |
18 | 行为型 | 观察者模式 | Observer Pattern | Doc | |
19 | 行为型 | 状态模式 | State Pattern | Doc | |
20 | 行为型 | 策略模式 | Strategy Pattern | Doc | |
21 | 行为型 | 模版模式 | Template Pattern | Doc | |
22 | 行为型 | 访问者模式 | Visitor Pattern | Doc |