简单讲一下有哪些常见的设计模式?
设计模式是软件设计中常见问题的典型、可复用的解决方案。它们就像是编程中的“棋谱”或“菜谱”,能帮助我们写出更灵活、可维护和可扩展的代码。
这里简单介绍一些最常见和核心的设计模式,主要来自经典的“GoF”(四人帮)23种模式,可以分为三大类:
1. 创建型模式
关注点: 如何创建对象,将对象的创建与使用分离。
-
单例模式
-
核心思想: 保证一个类只有一个实例,并提供一个全局访问点。
-
简单理解: 就像一个国家只能有一个总统。你通过一个特定渠道(如宪法规定)去获取这个总统,而不能自己
new一个出来。 -
常见场景: 数据库连接池、日志记录器、应用配置、线程池。
-
-
工厂方法模式
-
核心思想: 定义一个创建对象的接口,但让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。
-
简单理解: 有一家“汽车公司”接口,它规定了一个“造车”的方法。它的子公司“宝马工厂”和“奥迪工厂”分别实现这个“造车”方法,来生产具体的“宝马”和“奥迪”汽车。
-
常见场景: 日志记录器(可以输出到文件、控制台、数据库)、连接器(可以连接不同数据库)。
-
-
抽象工厂模式
-
核心思想: 提供一个接口,用于创建相关或依赖对象家族,而不需要指定具体的类。
-
简单理解: 比工厂方法更高级。比如有一个“家具工厂”接口,它能生产一整套家具(椅子、沙发、茶几)。然后有“现代风格工厂”和“古典风格工厂”来实现这个接口,分别生产一整套现代风格和古典风格的家具。
-
常见场景: 跨平台UI组件库(一套Windows风格的按钮、文本框,一套Mac风格的按钮、文本框)。
-
-
建造者模式
-
核心思想: 将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示。
-
简单理解: 就像组装电脑。导演(指导者)告诉建造者(如高配电脑建造者)按照一个固定的流程(装CPU、装内存、装硬盘)来建造,但建造者可以根据指令选择不同的部件(i9 CPU, 32G内存),最终组装出不同配置但流程相同的电脑。
-
常见场景: 创建复杂的对象,这些对象有很多可选的部件或配置,例如SQL查询构建器、邮件对象、游戏中的角色。
-
2. 结构型模式
关注点: 如何将类或对象组合成更大的结构。
-
适配器模式
-
核心思想: 将一个类的接口转换成客户期望的另一个接口。让原本接口不兼容的类可以一起工作。
-
简单理解: 就像电源转接头。你的中国插头(客户端)不能直接插到欧洲插座(目标接口)上,一个转接头(适配器)在中间进行转换,让它们能一起工作。
-
常见场景: 整合遗留系统、使用第三方库。
-
-
代理模式
-
核心思想: 为其他对象提供一种代理以控制对这个对象的访问。
-
简单理解: 就像明星的经纪人。你想找明星(真实对象)合作,必须先通过经纪人(代理)。经纪人可能会帮你安排时间、过滤不合理的请求,甚至直接拒绝你,而不用惊动明星本人。
-
常见场景: 远程代理(远程调用)、虚拟代理(延迟加载大图片)、保护代理(权限控制)、日志记录代理。
-
-
装饰器模式
-
核心思想: 动态地给一个对象添加一些额外的职责,就增加功能来说,它比生成子类更灵活。
-
简单理解: 就像给游戏角色穿装备。一个基础角色(被装饰对象),你可以给他穿上“武器”(装饰器A),再穿上“盔甲”(装饰器B),再戴上“戒指”(装饰器C)。每件装备都为角色增加了新的能力,并且可以自由组合。
-
常见场景: Java的I/O流(
FileInputStream被BufferedInputStream装饰,增加了缓冲功能)。
-
-
外观模式
-
核心思想: 为子系统中的一组接口提供一个一致的界面。它定义了一个高层接口,使得这一子系统更加容易使用。
-
简单理解: 就像医院的服务台。你看病需要去挂号、找科室、划价、取药等一系列复杂操作。服务台(外观)提供了一个“一站式”服务,你只需要告诉服务台你要干嘛,它来帮你协调内部所有部门。
-
常见场景: 简化复杂库或遗留系统的调用。
-
3. 行为型模式
关注点: 对象之间的职责分配和通信。
-
观察者模式
-
核心思想: 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
-
简单理解: 就像微信公众号(主题)。你(观察者)关注了某个公众号。当公众号发布新文章(状态改变)时,所有关注者都会收到推送(被通知)。
-
常见场景: 事件处理系统、MVC模式中的模型与视图关系、消息队列。
-
-
策略模式
-
核心思想: 定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换。策略模式使得算法可以独立于使用它的客户而变化。
-
简单理解: 就像出行的导航策略。你要去一个地方,可以选择“最快路线”、“最短路线”、“避开收费”等不同策略。你(上下文)不需要关心每种策略具体怎么算,只需要设置一个策略,然后执行它。
-
常见场景: 支付方式(支付宝、微信、信用卡)、排序算法(快排、冒泡、归并)、数据验证规则。
-
-
模板方法模式
-
核心思想: 定义一个操作中的算法骨架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
-
简单理解: 就像泡茶和泡咖啡的流程。父类定义了一个“冲泡饮料”的模板方法:1. 烧水 -> 2. 加原料 -> 3. 冲泡 -> 4. 加调料。子类“泡茶”和“泡咖啡”只需要重写“加原料”(茶叶/咖啡粉)和“加调料”(柠檬/糖)这两个步骤,而不用改变整个流程。
-
常见场景: 框架设计,Java中的
HttpServlet。
-
总结
| 模式 | 分类 | 一句话核心 |
|---|---|---|
| 单例 | 创建型 | 保证一个类只有一个实例。 |
| 工厂方法 | 创建型 | 子类决定创建哪个对象。 |
| 抽象工厂 | 创建型 | 创建一整套相关的产品。 |
| 建造者 | 创建型 | 分步骤地构建复杂对象。 |
| 适配器 | 结构型 | 转换接口,使不兼容的类能协作。 |
| 代理 | 结构型 | 控制和管理对原始对象的访问。 |
| 装饰器 | 结构型 | 动态地给对象添加新功能。 |
| 外观 | 结构型 | 为复杂子系统提供一个简单接口。 |
| 观察者 | 行为型 | 状态改变时,自动通知所有依赖者。 |
| 策略 | 行为型 | 封装算法,使它们可以互换。 |
| 模板方法 | 行为型 | 定义算法骨架,子类重写特定步骤。 |
初学者可以先从单例、工厂方法、观察者、策略这几个最常用的模式入手,理解它们的意图和适用场景,然后在自己的项目中尝试应用。记住,不要为了用模式而用模式,模式是为了解决实际问题而存在的。
- 点赞
- 收藏
- 关注作者
评论(0)