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