设计模式有哪些
设计模式是解决软件设计中常见问题的标准化方案,根据用途可分为三大类:创建型模式、结构型模式和行为型模式。以下是各类模式的详细分类及核心用途:
一、创建型模式(Creational Patterns)
关注对象的创建过程,隐藏创建逻辑,使代码更灵活。
-
单例模式(Singleton)
- 确保一个类只有一个实例,并提供全局访问点。
- 应用:日志管理器、配置管理器。
-
工厂模式(Factory)
- 简单工厂:通过一个工厂类根据参数创建不同对象。
- 工厂方法:定义创建对象的接口,由子类决定实例化哪个类。
- 抽象工厂:创建一系列相关或依赖的产品家族。
- 应用:UI组件库、数据库驱动创建。
-
建造者模式(Builder)
- 将复杂对象的构建与表示分离,分步构建对象。
- 应用:复杂对象(如文档、汽车)的构造。
-
原型模式(Prototype)
- 通过复制现有对象创建新对象,避免重复初始化。
- 应用:需要频繁创建相似对象的场景(如游戏角色克隆)。
-
对象池模式(Object Pool)
- 预先创建一组对象并复用,减少创建销毁开销。
- 应用:数据库连接池、线程池。
二、结构型模式(Structural Patterns)
处理类或对象的组合,优化结构以实现功能复用。
-
适配器模式(Adapter)
- 将一个类的接口转换为客户端期望的另一个接口,使不兼容的类可协同工作。
- 应用:新旧接口兼容、跨库交互。
-
装饰器模式(Decorator)
- 动态给对象添加额外功能,不改变其原有结构。
- 应用:IO流包装(如
BufferedReader
)、日志增强。
-
代理模式(Proxy)
- 为对象提供替代物,控制对原对象的访问(远程访问、延迟加载、权限控制)。
- 应用:远程代理(RPC)、缓存代理、保护代理。
-
组合模式(Composite)
- 将对象组合成树形结构,统一处理单个对象和组合对象。
- 应用:文件系统(文件/文件夹)、UI组件树。
-
桥接模式(Bridge)
- 将抽象与实现分离,使两者可独立变化。
- 应用:跨平台组件(如不同系统的窗口实现)。
-
外观模式(Facade)
- 为复杂系统提供简化接口,隐藏内部复杂性。
- 应用:框架的入口类(如
HttpClient
封装底层网络操作)。
-
享元模式(Flyweight)
- 共享细粒度对象,减少内存消耗。
- 应用:文字处理软件(重复字符复用)、游戏中的粒子效果。
三、行为型模式(Behavioral Patterns)
关注对象间的交互和职责分配,优化通信方式。
-
观察者模式(Observer)
- 定义一对多依赖,当一个对象状态变化时,所有依赖者自动收到通知。
- 应用:事件监听、消息订阅系统。
-
中介者模式(Mediator)
- 通过中介者封装多对象间的交互,减少直接耦合。
- 应用:聊天室、GUI窗口管理器。
-
策略模式(Strategy)
- 定义算法家族,使其可互相替换,客户端根据需求选择。
- 应用:排序算法切换、支付方式选择。
-
模板方法模式(Template Method)
- 父类定义算法骨架,子类实现具体步骤,固定流程同时保留灵活性。
- 应用:框架中的生命周期方法(如Servlet的
doGet/doPost
)。
-
迭代器模式(Iterator)
- 提供遍历集合元素的统一接口,无需暴露集合内部结构。
- 应用:
std::vector
的迭代器、Java的Iterator
接口。
-
命令模式(Command)
- 将请求封装为对象,实现请求的参数化、队列化和撤销。
- 应用:GUI按钮操作、事务日志(撤销/重做)。
-
状态模式(State)
- 允许对象在状态变化时改变行为,将状态逻辑封装到不同类中。
- 应用:订单状态流转(待支付→已支付→已发货)。
-
责任链模式(Chain of Responsibility)
- 将请求沿着处理链传递,直到有对象处理它,避免请求发送者与接收者耦合。
- 应用:日志级别处理、权限校验链。
-
访问者模式(Visitor)
- 在不修改对象结构的前提下,为对象添加新操作。
- 应用:数据结构的复杂遍历(如AST语法树分析)。
-
备忘录模式(Memento)
- 捕获对象状态并保存,以便后续恢复。
- 应用:编辑器的撤销功能、游戏存档。
-
解释器模式(Interpreter)
- 定义语言语法的解释器,用于解析特定格式的文本。
- 应用:表达式解析器、正则表达式引擎。
设计模式的核心价值
- 复用性:解决重复出现的设计问题。
- 可读性:使用公认的模式使代码更易理解。
- 灵活性:降低修改成本,适应需求变化。
实际开发中,应根据问题场景选择合适的模式,避免过度设计。