创建型设计模式
模式名称 | 概念 | 应用场景 | 优点 | 缺点 |
---|
单例模式 | 确保一个类只有一个实例,并提供全局访问点 | 数据库连接池、线程池、配置管理 | 节约资源、方便管理 | 违反单一职责原则、扩展性差、不利于测试 |
工厂方法模式 | 定义创建对象的接口,让子类决定实例化哪个类,将类的实例化延迟到子类 | 根据不同条件创建不同类型对象,如不同日志记录器 | 代码灵活、可维护性高 | 类的数量可能过多 |
抽象工厂模式 | 提供创建一系列相关或依赖对象的接口,无需指定具体类 | 创建不同风格的 UI 组件,如不同系统下的按钮、文本框 | 提高代码可维护性和可扩展性 | 实现复杂,修改困难 |
建造者模式 | 将复杂对象的构建与表示分离,相同构建过程可创建不同表示 | 创建复杂对象,如汽车、电脑 | 构建过程灵活、代码可读性高 | 代码量增加 |
原型模式 | 用原型实例指定创建对象的种类,通过拷贝原型创建新对象 | 对象创建成本高的场景,如数据库查询结果对象复制 | 提高创建对象效率 | 深拷贝和浅拷贝处理复杂 |
结构型设计模式
模式名称 | 概念 | 应用场景 | 优点 | 缺点 |
---|
适配器模式 | 将一个类的接口转换成客户希望的另一个接口,使不兼容的类能一起工作 | 旧系统与新系统接口适配,数据格式转换 | 提高类的复用性、灵活性 | 代码复杂度增加 |
桥接模式 | 将抽象部分与实现部分分离,使它们可独立变化 | 类存在多个变化维度,如不同颜色和形状的图形 | 提高系统可扩展性和可维护性 | 理解和设计难度大 |
组合模式 | 将对象组合成树形结构表示 “部分 - 整体” 层次结构,使用户对单个和组合对象使用一致 | 文件系统、菜单系统 | 简化客户端代码、方便添加新组件 | 可能导致设计过于通用 |
装饰器模式 | 动态给对象添加额外职责,比生成子类更灵活 | 给对象添加日志记录、权限验证等功能 | 灵活性高、可扩展性强 | 多层装饰时调试困难 |
外观模式 | 为子系统一组接口提供一致界面,定义高层接口使子系统更易用 | 简化复杂系统接口,如操作系统文件管理系统 | 简化客户端使用、降低耦合度 | 不符合开闭原则 |
享元模式 | 运用共享技术支持大量细粒度对象 | 游戏中的大量相同元素,如棋子、地图元素 | 节约内存、提高性能 | 逻辑复杂,维护成本高 |
代理模式 | 为其他对象提供代理以控制对该对象的访问 | 远程代理、虚拟代理、保护代理等,如网络请求代理 | 增强安全性、提高性能 | 可能增加响应时间 |
行为型设计模式
模式名称 | 概念 | 应用场景 | 优点 | 缺点 |
---|
责任链模式 | 使多个对象有机会处理请求,避免请求发送者和接收者耦合,请求沿链传递直到有对象处理 | 审批流程、日志处理 | 降低耦合度、可动态添加或修改处理者 | 可能导致请求处理不明确 |
命令模式 | 将请求封装为对象,可用不同请求对客户参数化,支持请求排队、记录日志和撤销操作 | 实现撤销、重做功能,如文本编辑器撤销操作 | 可扩展性强、方便实现撤销和恢复 | 类的数量增加 |
解释器模式 | 给定语言,定义其文法表示和解释器,用该表示解释语言句子 | 编译器、正则表达式引擎 | 易于改变和扩展文法 | 复杂文法实现困难 |
迭代器模式 | 提供顺序访问聚合对象元素的方法,不暴露对象内部表示 | 遍历各种集合,如列表、树 | 简化遍历操作、支持多种遍历方式 | 可能增加系统开销 |
中介者模式 | 用中介对象封装对象交互,使对象耦合松散,可独立改变交互 | 聊天室、MVC 框架中的控制器 | 降低耦合度、提高可维护性 | 中介者可能过于复杂 |
备忘录模式 | 不破坏封装性,捕获对象内部状态并在对象外保存,可恢复对象状态 | 游戏存档、文本编辑器撤销功能 | 方便恢复对象状态、保护对象封装性 | 可能占用大量内存 |
观察者模式 | 定义对象间一对多依赖关系,对象状态改变时通知并更新依赖对象 | 消息通知系统、股票价格变化通知 | 实现对象间松耦合、支持广播通信 | 可能导致循环依赖 |
状态模式 | 允许对象在内部状态改变时改变其行为,对象看起来修改了类 | 工作流、游戏角色状态变化 | 提高代码可维护性和可扩展性 | 类的数量增加 |
策略模式 | 定义一系列算法,将每个算法封装起来并使它们可互换,算法变化不影响使用算法的客户 | 排序算法选择、支付方式选择 | 算法可自由切换、避免多重条件判断 | 策略类数量增多 |
模板方法模式 | 定义一个操作中的算法骨架,将一些步骤延迟到子类中,子类可在不改变算法结构的情况下重定义某些步骤 | 数据库访问、文件处理 | 提高代码复用性、便于维护 | 可能限制子类的灵活性 |
访问者模式 | 表示一个作用于某对象结构中各元素的操作,使可在不改变各元素类的前提下定义作用于这些元素的新操作 | 编译器语法树处理、报表生成 | 增加新操作方便、符合开闭原则 | 破坏对象封装性 |
设计模式有很多,主要会考察单例模式,策略模式,责任链模式,模板方法模式,工厂方法,抽象工厂方法,原型模式。发布这个主要是方便看,不用重新上网找。