设计模式是软件工程中用于解决常见设计问题的可重用解决方案。它们由“四人帮”(GoF,Gang of Four)在《设计模式:可复用面向对象软件的基础》一书中首次系统化总结,共提出了 23 种经典设计模式,分为三大类:
1. 创建型模式(Creational Patterns)
这些模式关注对象的创建机制,旨在使系统独立于对象的创建、组合和表示。
单例模式(Singleton)
确保一个类只有一个实例,并提供全局访问点。
示例:数据库连接池、日志记录器。
工厂方法模式(Factory Method)
定义一个创建对象的接口,但由子类决定实例化哪个类。
示例:日志记录器工厂。
抽象工厂模式(Abstract Factory)
提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们的具体类。
示例:跨平台的 UI 组件库。
建造者模式(Builder)
将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示。
示例:构造复杂的 SQL 查询。
原型模式(Prototype)
通过复制现有对象来创建新对象,而不是通过实例化类。
示例:对象克隆。
2. 结构型模式(Structural Patterns)
这些模式关注类和对象的组合,以形成更大的结构。
适配器模式(Adapter)
将一个类的接口转换成客户端期望的另一个接口。
示例:将旧系统接口适配到新系统。
桥接模式(Bridge)
将抽象部分与实现部分分离,使它们可以独立变化。
示例:不同操作系统下的图形渲染。
组合模式(Composite)
将对象组合成树形结构以表示“部分-整体”的层次结构。
示例:文件系统。
装饰器模式(Decorator)
动态地给对象添加额外的职责,而无需修改其代码。
示例:为对象添加日志、缓存等功能。
外观模式(Facade)
提供一个统一的接口来访问子系统中的一组接口。
示例:简化复杂 API 的调用。
享元模式(Flyweight)
通过共享技术有效地支持大量细粒度对象。
示例:文本编辑器中的字符对象。
代理模式(Proxy)
为其他对象提供一个代理以控制对这个对象的访问。
示例:远程代理、虚拟代理、保护代理。
3. 行为型模式(Behavioral Patterns)
这些模式关注对象之间的职责分配和通信。
责任链模式(Chain of Responsibility)
将请求的发送者和接收者解耦,使多个对象都有机会处理请求。
示例:日志记录器链。
命令模式(Command)
将请求封装为对象,从而支持参数化、队列化和日志化操作。
示例:撤销/重做功能。
解释器模式(Interpreter)
定义语言的文法,并用解释器来解释语言中的句子。
示例:正则表达式解析。
迭代器模式(Iterator)
提供一种方法顺序访问聚合对象中的元素,而无需暴露其内部表示。
示例:遍历集合。
中介者模式(Mediator)
定义一个中介对象来封装一组对象之间的交互。
示例:聊天室中的消息传递。
备忘录模式(Memento)
在不破坏封装性的前提下,捕获并外部化对象的内部状态,以便稍后恢复。
示例:撤销操作。
观察者模式(Observer)
定义对象间的一对多依赖关系,当一个对象改变状态时,其所有依赖者都会收到通知。
示例:事件监听器。
状态模式(State)
允许对象在其内部状态改变时改变其行为。
示例:订单状态机。
策略模式(Strategy)
定义一系列算法,封装它们并使它们可以互换。
示例:排序算法、支付方式。
模板方法模式(Template Method)
定义一个算法的骨架,而将一些步骤延迟到子类中实现。
示例:框架中的钩子方法。
访问者模式(Visitor)
表示一个作用于某对象结构中的各元素的操作,它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。
示例:对复杂对象结构的操作。
总结
设计模式是解决常见设计问题的最佳实践,但并非所有场景都适用。
理解每种模式的适用场景和优缺点是关键。
在实际开发中,可以根据需求灵活组合或调整设计模式。