设计模式是软件开发中针对常见问题的可复用解决方案。它们提供了经过验证的开发范式,帮助创建灵活、可维护且易于理解的代码。
设计模式的分类
设计模式通常分为三大类:
1. 创建型模式
专注于对象的创建机制,试图以适合特定情况的方式创建对象。
- 单例模式 (Singleton): 确保
一个类
只有一个实例
,并提供全局访问
点 - 工厂方法 (Factory Method): 定义一个用于创建对象的
接口
,让子类决定实例化哪个类 - 抽象工厂 (Abstract Factory): 提供一个创建一系列相关对象的
接口
,无需指定其具体类 - 建造者模式 (Builder): 将复杂对象的
构建
与其表示
分离 - 原型模式 (Prototype): 使用
原型实例
指定创建对象的种类,通过复制这些原型创建新对象
2. 结构型模式
关注类和对象
的组合
,形成更大的结构。
- 适配器 (Adapter): 将一个类的
接口转换
成客户希望的另一个接口 - 桥接 (Bridge): 将
抽象部分
与实现部分
分离,使它们可以独立变化 - 组合 (Composite): 将对象组合成
树形结构
表示"部分-整体"层次结构
- 装饰器 (Decorator):
动态
地给对象添加额外的职责
- 外观 (Facade): 为子系统中的一组接口提供一个一致的
高层接口
- 享元 (Flyweight): 使用
共享
技术有效地支持大量细粒度对象 - 代理 (Proxy): 为其他对象提供一个代理以控制对这个对象的访问
3. 行为型模式
关注对象之间的责任分配和算法。
- 观察者 (Observer): 定义对象间的一种
一对多依赖
关系 - 策略 (Strategy): 定义一系列算法并使它们可
互换
- 命令 (Command): 将
请求封装
成对象,允许参数化客户端
- 模板方法 (Template Method): 定义
算法的骨架
,将某些步骤延迟到子类中 - 迭代器 (Iterator): 提供一种
顺序访问集合元素
的方法,而不暴露其内部表示
- 状态 (State): 允许对象在其内部状态改变时改变其行为
- 责任链 (Chain of Responsibility): 将请求沿着处理链传递,直到有一个处理程序处理它
- 中介者 (Mediator): 定义
一个对象来封装一组对象
之间的交互 - 备忘录 (Memento): 在不破坏封装性的前提下捕获对象内部状态
- 访问者 (Visitor): 在不改变类的前提下定义新的操作
- 解释器 (Interpreter): 为语言定义一个语法表示,并定义一个解释器
设计模式的作用
1. 提高代码质量
- 可
重用
性: 提供经过验证的解决方案 - 灵活性: 使系统更容易适应变化
- 可维护性: 遵循良好的设计原则,如单一职责、开闭原则等
2. 提高开发效率
- 标准化: 提供
通用词汇
,便于开发者沟通 - 减少错误: 采用
已验证的解决方案减少常见错误
3. 应对特定问题
解耦
: 减少组件间的依赖
- 扩展性: 便于系统
后续扩展
- 性能优化: 某些模式可提高程序性能
4. 促进良好的软件架构
- 分层: 帮助实现关注点分离
- 模块化: 鼓励将系统分解为独立模块
使用设计模式的注意事项
- 避免过度使用: 不要仅为使用设计模式而使用它们
- 权衡利弊: 每种模式都有适用场景和不适用场景
- 理解本质: 理解模式背后的设计原则比死记硬背模式更重要
- 结合具体情况: 模式可以根据具体需求进行调整
设计模式是开发人员工具箱中的重要工具,但应该根据具体问题选择合适的模式,而不是试图将模式强加到不适合的情况中。
GoF设计模式
GoF设计模式指的是由"四人帮"(Gang of Four)编写的设计模式,这是软件工程中最经典、最有影响力的设计模式集合。
什么是"四人帮"(Gang of Four)?
"四人帮"是指《设计模式:可复用面向对象软件的基础》(Design Patterns: Elements of Reusable Object-Oriented Software)一书的四位作者:
- Erich Gamma
- Richard Helm
- Ralph Johnson
- John Vlissides
这本书于1994年出版,成为软件设计领域的奠基之作
。书中描述的23种设计模式已成为软件工程的标准词汇和知识体系。
GoF设计模式的分类
GoF设计模式总共有23种,分为三大类:
1. 创建型模式 (Creational Patterns)
处理对象创建机制,试图以适合特定情况的方式创建对象。
2. 结构型模式 (Structural Patterns)
关注类和对象的组合,形成更大的结构。
3. 行为型模式 (Behavioral Patterns)
关注对象之间的通信和责任分配。
GoF设计模式的重要性
- 通用语言: 为开发人员提供了讨论软件设计的通用词汇
- 经验凝练: 代表了面向对象设计领域数十年的经验积累
- 指导作用: 为解决常见设计问题提供了经过验证的解决方案
- 教育价值: 成为软件工程教育的重要组成部分
- 标准化: 被广泛接受为软件设计的标准参考
GoF设计模式的影响
GoF设计模式已经深入影响了软件工程领域,许多现代编程语言和框架都直接采用或受到这些模式的启发:
- Java中的Collections框架使用了迭代器模式
- Spring框架大量使用工厂、单例、代理等模式
- Android开发中的适配器模式广泛应用于列表视图
- React中的组件概念与组合模式有相似之处
尽管GoF设计模式问世已近30年,但它们仍然是软件设计领域的基础知识,任何专业软件开发人员都应该了解并掌握这些模式的应用场景和实现方式。
创建型设计模式在计算机应用中的常见案例
1. 单例模式 (Singleton)
确保一个类只有一个实例,并提供全局访问点
常见案例:
- 操作系统的任务管理器
- Windows中只能打开一个任务管理器实例
- 无论用户尝试多少次打开,系统只维护一个实例
- 数据库连接池
- 应用程序通常只需要
一个数据库连接池
来管理所有连接 - 如MySQL或Oracle数据库的连接管理
- 应用程序通常只需要
- 文件系统
- 操作系统维护单一的文件系统实例
- 所有文件操作都通过这个实例进行
- 打印机后台处理程序
- 计算机上的打印任务需要由单一后台程序协调处理
- 确保打印任务按顺序处理,不会冲突
- 配置管理器
- 应用程序的配置信息通常由单个配置管理器实例维护
- 如Windows注册表访问
2. 工厂方法 (Factory Method)
定义创建对象的接口,让子类决定实例化哪个类
常见案例:
- 文档处理应用
- Microsoft Office中,根据
文件类型
创建不同的文档编辑器
- Word创建文档编辑器,Excel创建电子表格编辑器
- Microsoft Office中,根据
- 图像处理软件
- Photoshop根据不同的文件格式(.jpg, .png, .gif)创建相应的处理器
- 每种格式的解码和编码逻辑不同
- GUI组件创建
- 不同操作系统平台创建不同的UI控件
- 如按钮在Windows、macOS和Linux上的具体实现不同
- 设备驱动程序
- 操作系统根据检测到的硬件类型加载相应的驱动程序
- 比如检测到不同打印机型号时
- 插件系统
- 浏览器如Chrome、Firefox根据文件类型加载不同的插件处理器
- PDF文件调用PDF查看器,视频文件调用视频播放器
3. 抽象工厂 (Abstract Factory)
提供创建一系列相关对象的接口,无需指定具体类
常见案例:
-
不同操作系统的GUI工具包
- Java的Swing库根据运行平台提供不同外观的UI组件
- 所有组件(按钮、菜单、滚动条)风格一致,匹配特定操作系统
-
办公套件组件
- Microsoft Office创建一系列相关的应用组件
- 文档编辑器、表格处理器、演示文稿工具共享一致的界面和功能
-
游戏中的角色和环境生成
- 游戏引擎根据选择的主题创建匹配的角色、环境和道具
- 如"中世纪工厂"创建相关的中世纪元素,"未来工厂"创建科幻元素
-
数据库访问系统
-
ORM框架(如Hibernate)创建与特定数据库兼容的查询生成器、连接管理器等
**ORM(Object-Relational Mapping,对象关系映射)**是一种编程技术,用于在面向对象编程语言中,实现面向对象的对象模型与关系型数据库的数据结构之间的转换。ORM框架是这种技术的具体实现,它作为应用程序和数据库之间的中间层,简化了数据库操作
MySQL工厂创建MySQL兼容组件,Oracle工厂创建Oracle兼容组件
-
-
跨平台多媒体框架
- 媒体播放器根据平台创建相应的音频处理器、视频渲染器等组件
- Windows版和Mac版使用不同的底层多媒体组件,但提供统一接口
4. 建造者模式 (Builder)
将复杂对象的构建与表示分离
常见案例:
- 文档生成器
- PDF生成库允许逐步构建文档,添加页面、段落、图像等
- 安装向导
- 软件安装程序引导用户
一步步完成
安装过程 - 每步收集不同信息,最终构建完整的安装配置
- 软件安装程序引导用户
- 电子邮件客户端
- 电子邮件撰写过程中,用户
逐步
添加收件人、主题、正文、附件 - 最终生成一个完整的电子邮件对象
- 电子邮件撰写过程中,用户
- 3D建模软件
- 如Blender、AutoCAD中,复杂3D模型通过多个构建步骤创建
- 分步处理几何形状、材质、动画等
- 查询构建器
- 数据库查询工具(如SQL查询生成器)允许用户逐步构建复杂查询
- 如添加选择字段、过滤条件、排序规则等
5. 原型模式 (Prototype)
通过复制
现有实例创建新对象
常见案例:
- 图形编辑器
- Photoshop、Illustrator等允许复制图层或对象
- 用户创建一个对象后可以复制多份,然后微调
- 操作系统的文件复制
- 当用户复制文件或文件夹时,系统创建原始文件的精确副本
"复制-粘贴"
操作实质上是原型模式的应用
- 游戏中的单位生成
- 战略游戏如《星际争霸》中,建筑物生产多个相同单位
- 游戏引擎从原型对象复制,而不是每次从头创建
- 文档模板系统
- Microsoft Word模板或PowerPoint模板
- 用户从预设模板开始,复制后进行自定义
- 浏览器标签克隆
- 现代浏览器允许复制当前标签页
- 新标签继承原标签的URL和状态,但是独立的实例
这些创建型模式在我们日常使用的软件和操作系统中无处不在,虽然作为用户我们可能没有意识到,但它们是高效软件设计的基础,使系统能够灵活地创建和管理对象。
创建型设计模式在建筑结构设计与CAD管理中的应用
1. 单例模式 (Singleton)
在建筑与CAD领域的应用:
- 项目配置管理
- 单个项目配置管理器确保所有设计人员使用相同的设计标准和参数
统一管理图层标准、线型定义和文本样式
- 图纸版本控制系统
单一的版本控制
实例管理整个项目的图纸变更历史- 确保所有团队成员看到相同的最新版本信息
- 资源管理器
单一的材料库和构件库管理器
,确保所有设计师使用统一的构件标准集中管理和更新建筑标准构件
2. 工厂方法 (Factory Method)
在建筑与CAD领域的应用:
- 标准构件生成
- 根据
不同建筑类型(住宅、商业、工业)生成相应的标准构件
- 例如,住宅设计时调用
住宅门窗工厂
,商业项目调用商业规格门窗工厂
- 根据
- 多种规范适配
- 根据
不同国家或地区的建筑规范
自动生成符合标准的构件 美国规范工厂
生成符合美国标准的结构元素,欧洲规范工厂
生成符合欧标的元素
- 根据
- 结构计算模型生成
- 根据结构类型(钢结构、混凝土结构、木结构)生成相应的计算模型
- 每种结构类型使用不同的分析方法和参数
- 标注系统
- 根据图纸类型(建筑图、结构图、设备图)生成不同的标注样式和规则
- 自动应用适合特定工程领域的标注标准
3. 抽象工厂 (Abstract Factory)
在建筑与CAD领域的应用:
- 完整建筑系统族
- 创建一系列相关的建筑系统组件(结构系统、外墙系统、屋顶系统)
- "钢结构工厂"生成匹配的钢柱、钢梁、钢连接件;"混凝土工厂"生成匹配的混凝土柱、梁、板
- 不同风格的建筑元素
- 现代风格工厂、古典风格工厂、工业风格工厂各自创建一套风格一致的建筑元素
- 包括门窗、栏杆、装饰构件等,保持设计语言统一
- BIM系统集成
- 为不同的BIM软件(Revit、ArchiCAD、Tekla)创建相应的数据交换接口组
- 每套接口负责导入/导出、属性映射、几何转换等相关功能
- 多专业协同设计
- 为不同专业(建筑、结构、机电)创建匹配的图层系统、标注系统和符号库
- 确保不同专业图纸在表达方式上的一致性
- 材料规格系统
- 根据项目类型创建配套的材料规格系统
- 医疗建筑工厂创建符合医疗建筑要求的材料系统(抗菌、易清洁),住宅建筑工厂创建符合住宅需求的材料系统
4. 建造者模式 (Builder)
在建筑与CAD领域的应用:
- 复杂结构模型创建
分步骤构建复杂
的结构模型,如桁架、网架系统- 先创建主体结构,再添加节点连接,最后应用荷载和边界条件
**分层图纸生成**
- 逐步构建完整图纸,分别处理基础图层、
结构图层
、标注图层
等 - 允许设计师控制每一步的细节,最终生成完整图纸
- 逐步构建完整图纸,分别处理基础图层、
- 参数化建筑模型
- 通过一系列步骤构建参数化建筑模型
- 设置平面参数,然后是立面参数,再添加细节参数,最终生成完整模型
- 施工图集编制
- 分步骤创建完整的施工图集
- 逐步添加平面图、立面图、剖面图、详图和说明文字
- 定制报表生成
- 构建复杂的工程量清单或材料报表
- 分别设置报表样式、数据源、计算规则和格式化选项
5. 原型模式 (Prototype)
在建筑与CAD领域的应用:
- 标准详图库
- 从预定义的标准详图原型复制并微调
- 如楼梯详图、门窗详图可以从标准原型复制后调整尺寸和材料
- 典型楼层复制
- 在高层建筑设计中复制标准楼层
- 先完成一个典型楼层的设计,然后复制多份,只需调整个别不同之处
- 构件阵列
- 复制单个构件(如柱子、栏杆)创建阵列
- AutoCAD中的阵列命令本质上利用了原型模式
- 项目模板
- 基于成功项目创建新项目
- 复制项目模板包括图层设置、样式定义和常用图块
- 图纸集复用
- 复制现有图纸集作为新项目的起点
- 特别适用于系列化建筑项目,如连锁商店、标准化学校等
在文件管理中的实际应用
- 基于模板的工作流
- 使用建造者模式定义
标准化的图纸制作流程
- 确保所有项目文件按照
相同的标准创建和命名
- 使用建造者模式定义
- 文件版本控制
- 使用原型模式创建图纸的检查点版本
- 单例模式确保版本历史的一致性
- 跨项目资源共享
- 抽象工厂创建一系列兼容的项目文件和资源
- 工厂方法根据不同项目阶段生成相应的文档类型
- 自动化文件处理
- 为不同文件类型创建专用处理器(工厂方法)
- 建造者模式用于生成复合文档,如设计报告
- 协同工作环境
- 单例模式维护统一的项目状态
- 抽象工厂确保不同团队成员生成格式一致的文件
这些设计模式在建筑设计和CAD管理中的应用,不仅提高了设计效率,还确保了设计标准的一致性和项目文件的规范化管理,对于大型复杂的建筑项目尤为重要。