计模式(Design Patterns)是软件开发中针对常见问题的经典解决方案,分为三大类:创建型、结构型和行为型。以下是23种经典设计模式及其简要说明:
1. 创建型模式(Creational Patterns)
关注对象的创建机制,提升灵活性和复用性。
-
单例模式(Singleton)
- 确保一个类只有一个实例,并提供全局访问点。
- 示例:数据库连接池、日志管理器。
-
工厂方法模式(Factory Method)
- 定义创建对象的接口,但由子类决定实例化哪个类。
- 示例:
LoggerFactory生成不同格式的日志器。
-
抽象工厂模式(Abstract Factory)
- 创建相关或依赖对象的家族,而无需指定具体类。
- 示例:GUI库(跨平台的按钮、文本框组合)。
-
建造者模式(Builder)
- 分步骤构建复杂对象,分离构造与表示。
- 示例:
StringBuilder、SQL查询构造器。
-
原型模式(Prototype)
- 通过克隆现有对象来创建新对象,避免重复初始化。
- 示例:Java的
Cloneable接口。
2. 结构型模式(Structural Patterns)
关注类和对象的组合方式,形成更大结构。
6. 适配器模式(Adapter)
- 使不兼容接口能协同工作。
- 示例:将旧版API适配到新系统。
-
装饰器模式(Decorator)
- 动态扩展对象功能,避免子类爆炸。
- 示例:Java I/O流(
BufferedInputStream包装FileInputStream)。
-
代理模式(Proxy)
- 为对象提供代理以控制访问(如延迟加载、权限校验)。
- 示例:Spring AOP的动态代理。
-
外观模式(Facade)
- 提供简化接口,隐藏子系统复杂性。
- 示例:一键启动电脑(封装CPU、内存、硬盘等操作)。
-
桥接模式(Bridge)
- 分离抽象与实现,使两者独立变化。
- 示例:不同操作系统下的图形渲染API。
-
组合模式(Composite)
- 以树形结构处理部分-整体关系。
- 示例:文件系统(文件+文件夹统一接口)。
-
享元模式(Flyweight)
- 共享细粒度对象,减少内存消耗。
- 示例:游戏中的重复纹理、字符池。
3. 行为型模式(Behavioral Patterns)
关注对象间的通信和职责分配。
13. 观察者模式(Observer)
- 定义一对多依赖,对象状态变化时自动通知依赖者。
- 示例:事件监听、React/Vue的数据响应式。
-
策略模式(Strategy)
- 封装算法族,使其可互换。
- 示例:排序算法(快速排序、冒泡排序动态切换)。
-
命令模式(Command)
- 将请求封装为对象,支持撤销、队列等操作。
- 示例:GUI按钮操作、事务管理。
-
责任链模式(Chain of Responsibility)
- 让多个对象依次处理请求,避免请求者与接收者耦合。
- 示例:Web框架的中间件(如Express.js)。
-
状态模式(State)
- 允许对象在内部状态改变时改变行为。
- 示例:订单状态(待支付、已发货、已完成)。
-
模板方法模式(Template Method)
- 定义算法骨架,子类重写特定步骤。
- 示例:
AbstractList的通用列表操作。
-
迭代器模式(Iterator)
- 提供统一方式遍历集合对象。
- 示例:Java的
Iterator接口。
-
中介者模式(Mediator)
- 通过中介对象减少对象间直接通信。
- 示例:聊天室(用户不直接互发消息,通过服务器中转)。
-
备忘录模式(Memento)
- 捕获并外部化对象状态,以便后续恢复。
- 示例:游戏存档、撤销操作。
-
访问者模式(Visitor)
- 将算法与对象结构分离,便于新增操作。
- 示例:编译器对AST(抽象语法树)的不同分析。
-
解释器模式(Interpreter)
- 定义语言的语法表示,并解释执行。
- 示例:正则表达式引擎、SQL解析。
如何选择设计模式?
- 创建对象复杂? → 工厂、建造者、原型。
- 需解耦接口与实现? → 桥接、适配器。
- 动态扩展功能? → 装饰器、策略。
- 管理多个对象协作? → 观察者、中介者。