设计模式速览

简介: 设计模式速览

设计模式是软件开发领域多年来的经验总结以及最佳实践,使用设计模式不仅可以让我们编写可重用的底层代码,更有助于构建一个稳健可靠的整体系统架构。


设计模式与面向对象编程和 Java 语言实践密切相关,但其中心思想却是可以被广泛借鉴的,不论使用的是哪种编程语言。另外,我相信即使你之前并不了解设计模式的相关概念,但在你的实践过程中仍然或多或少的使用到了它。


设计模式可以分为三种类型:创建型、结构型、行为型,它们分别关注对象的创建结构、行为


01
创建型模式


创建型模式重点关注的是对象的创建即实例化过程。

1、Singleton


单例模式。一个类只能有一个实例,并且可以全局访问。



2、Factory


工厂模式。工厂可能是一种函数或方法,其产出的产品就是实例化的对象。比如 new 。工厂有简单的、也有复杂的,因此也可以详细分为 simple factory 简单工厂模式(也称为静态工厂模式)、factory method 工厂方法模式、abstract factory 抽象工厂模式。



3、Builder


建造者模式。使用多个简单的步骤一步一步构建复杂的对象。


比如一份 KFC 套餐可能由主食、小吃、饮料构成,那么这个复杂的套餐对象可以表示为:

new KFC('套餐').add('主食').add('小吃').add('饮料').build()

4、Prototype


原型模式。通过克隆一个已存在的对象从而创建一个新的对象。



02


结构型模式


结构型模式关注的是如何将类或者对象结合在一起形成更大的结构,就像搭积木一样,通过简单积木的组合去形成一个复杂强大的结构。


1、Adapter


适配器模式。你的笔记本是 typeC 接口,而显示器却是 HDMI 接口,这时候怎么办?接一个适配器呗,适配器的作用就是不改变原来的接口,让它们仍然能够对接成功。



2、Bridge


桥接模式。假设你的网站具有三个页面和三种不同的主题色彩,页面与主题设计呢,每一页面都挂载三种主题吗,如下图:这样,页面和主题相互耦合,当某一个页面或主题发生变化时则很麻烦,因此我们可以将页面和主题分开:

然后通过桥接的方式,将它们组合在一起。



3、Composite


复合模式。把一组相似的对象当成一个单一对象。比如某个组织的人员可能有不同的职责、职级、或者下属,但是他们构成了单一的组织。



4、Decorator


装饰器模式。不改变对象的结构,通过添加装饰器的方式,为对象增加额外的功能。比如 @ 方法。



5、Facada


外观模式。隐藏内部的复杂性,对外提供一个简单的接口。比如,电脑如何关机?答案是点击关机按钮。这里的关机按钮是一个简单的对外展示,而实际关机的一系列复杂动作比如关闭进程、保存文件等等都被隐藏在了内部。


6、Flyweight


享元模式。通过共享的方式避免对象的重复创建。比如,你想要买一杯豆浆,商家会一杯一杯的去打磨制作吗,显然不会,他会事先制作好一大桶豆浆,你需要一杯则直接给你装一杯就好了。

7、Proxy
代理模式。给某个对象提供一个代理,通过代理控制对原对象的引用。


03


行为型模式
行为型模式重点关注的是对象之间的相互作用。


1、Chain of Responsibility
责任链模式。链式处理对象。比如,我有微信、支付宝、银行卡三种支付方式,当我要付款时则先检查微信时的钱够不够,如果够则支付完成,如果不够,则去检查支付宝的钱够不够,够就支付完成,不够就去检查银行卡。

2、Command
命令模式。调用者发出命令,命令传递给接受者,接受者执行。比如,你在餐厅吃饭,首先你发出了命令即点菜,然后,菜单通过服务员传递给了厨师,厨师最后制作菜品。

3Iterator


迭代器模式。它提供了一种访问对象元素,但是又不暴露底层表示的方法。比如,我们并不知道收音机所有的频道,但是可以通过上一个频道、下一个频道这样的方式去访问具体的频道。



4、Mediator


中间人模式。通过一个中介对象来封装一系列的对象交互,而各个对象之间不需要显示相互引用。比如,你通过手机与另一个人交谈,你说的话并不是直接发送给对方的,而是通过网络服务商作为中间人转达。



5、Memento


备忘录模式。在对象的外部记录对象的状态。比如某些游戏的存档。



6、Observer


观察者模式。就像发布-订阅或者监听器一样,某个事件被触发了,观察者就会接收到通知。



7、Visitor


访客模式。不修改对象结构向其添加新的操作。



8、Strategy


策略模式。让算法独立于使用者而变化。比如冒泡排序对于小数据集效果更好,而快速排序对于大数据集效果更好,为了解决这个问题,我们就使用了一种策略,当输入是小数据集时使用冒泡排序,反之使用快速排序。



9、State


状态模式。允许一个对象在其内部状态改变时改变它的行为。比如,你使用画布程序画图,当你的画笔颜色是红色时,其行为是红色绘画,当颜色为蓝色时,行为改变为蓝色绘画。



10、Template Method


模板方法模式。定义具体的模板,在模板的基础上进行操作。比如,房间的骨架都是固定搭好的,但是房间内具体怎么装修布置则由你来完成。



04


结语


其实设计模式远不止上述的这些,某些例子也不一定准确,在实际应用中不同的设计模式也可能组合交织在一起。本文只是一个简述,让大家对设计模式有一个初步的贴切的了解。

目录
相关文章
|
6月前
|
人工智能 前端开发 Java
“最近我给有代码洁癖的同事墙裂安利了通义灵码”
通义灵码2.5.0版本现已全面支持Qwen3,采用混合专家架构,参数量仅为DeepSeek-R1的1/3,是国内首个“混合推理模型”。它在性能评测中超越了DeepSeek-R1、OpenAI-o1等国际主流模型,并全面支持MCP能力,集成国内最大MCP中文社区。作为程序员体验后发现,通义灵码可通过简单指令生成完整项目代码,包括前后端、接口调用等,大幅降低开发门槛。文中通过两个Demo展示了其强大功能:一是聚合多平台热榜数据并推送微信通知;二是基于高德和12306 MCP生成旅游攻略HTML页面。整个过程无需手动编写代码,推荐开发者尝试。
323 47
|
Windows
笔记本电脑亮度调整无效、字体大小改变的解决方案
本文介绍Windows电脑系统更新或重装系统后,出现屏幕亮度最高且无法调整、电脑字体变小等问题的解决方法~
658 1
笔记本电脑亮度调整无效、字体大小改变的解决方案
|
存储 人工智能 弹性计算
阿里云高性能计算负责人何万青:阿里云大计算加速HPC与AI融合
与AI相结合,高性能计算能够帮助科研人员将精力集中于专业领域。
阿里云高性能计算负责人何万青:阿里云大计算加速HPC与AI融合
|
弹性计算 Ubuntu Linux
在阿里云ECS上的Hyperledger Fabric 1.1.0 搭建与测试
从去年底到现在一直在准备今年的竞赛作品,其中一个主力项目是基于Hyperledger Fabric联盟链框架的电子病历相关应用。在完成作品背景调研、需求分析以及设计工作后,目前团队在进行作品实现。所以开始研究在阿里云ECS云服务器上搭建Fabric项目的基础环境。由于Fabric项目是一个非常新、年轻的开源框架,中文资料稀少,英文资料理解困难,因此在云服务器上完成环境搭建并跑通示例非常不容易。特写此文,作为工具查阅。
|
存储 弹性计算 应用服务中间件
阿里云服务器续费续费流程及续费优惠价格(一文全搞定)
阿里云服务器如何续费?阿里云服务器怎么续费更划算?云服务器续费优惠价格
3485 0
阿里云服务器续费续费流程及续费优惠价格(一文全搞定)
|
Python
Python:打包配置文件 setup.py 详解
Python:打包配置文件 setup.py 详解
1181 0
Python:打包配置文件 setup.py 详解
|
人工智能 算法 安全
智能化测试技术探索与实践——AAAS/IEEE Fellow、北京大学讲席教授谢涛阿里行
近期谢涛教授将围绕如何通过AI的方式提升端到端功能自动化测试的能力和价值与淘系技术部技术质量团队开展访问研究,共同探索手工探索式测试、Monkey等方式,成本和范围无法保障;目前端到端功能自动化测试工具“逐步执行、单点验证”为主的传统模式成本高、难以快速应用和推广等难题。 本次淘系技术部邀请到谢涛教授就“软件质量的下一个五年:智能化测试技术探索与实践”为主题,面向阿里经济体技术同学进行分享。
3167 0
智能化测试技术探索与实践——AAAS/IEEE Fellow、北京大学讲席教授谢涛阿里行
|
大数据
从秒拍、小咖秀到一直播 视频矩阵背后的蝴蝶效应
从秒拍、小咖秀到一直播 视频矩阵背后的蝴蝶效应
从秒拍、小咖秀到一直播 视频矩阵背后的蝴蝶效应
|
关系型数据库 Java Linux
Docker | Docker 简介、安装与入门
Docker | Docker 简介、安装与入门
847 0
Docker | Docker 简介、安装与入门