常用的设计模式有哪些

设计模式是软件开发中针对反复出现的问题所总结的通用解决方案。根据《设计模式:可复用面向对象软件的基础》(四人帮著作),设计模式主要分为三大类:创建型结构型行为型。以下是最常用的设计模式及其核心概念:

一、创建型模式(Creational Patterns)

关注点:对象的创建机制,解耦对象的创建和使用。

  1. 单例模式(Singleton)
  • 意图:确保一个类只有一个实例,并提供全局访问点。
  • 应用:配置管理器、日志记录器、数据库连接池。
  1. 工厂模式(Factory Method)
  • 意图:定义创建对象的接口,让子类决定实例化哪个类。
  • 应用:根据条件创建不同类型的对象(如形状工厂、数据库连接工厂)。
  1. 抽象工厂模式(Abstract Factory)
  • 意图:提供一个创建一系列相关或依赖对象的接口,无需指定具体类。
  • 应用:创建跨平台的UI组件(如Windows/Linux的按钮、文本框)。
  1. 建造者模式(Builder)
  • 意图:将复杂对象的构建与表示分离,允许相同构建过程创建不同表示。
  • 应用:构建复杂对象(如汽车、HTML文档)。
  1. 原型模式(Prototype)
  • 意图:通过复制现有对象来创建新对象,无需知道创建细节。
  • 应用:对象初始化成本高或需要避免构造函数的约束。

二、结构型模式(Structural Patterns)

关注点:如何将类或对象组合成更大的结构。

  1. 代理模式(Proxy)
  • 意图:通过代理对象控制对原对象的访问。
  • 应用:远程代理(如RMI)、虚拟代理(延迟加载)、保护代理(权限控制)。
  1. 装饰器模式(Decorator)
  • 意图:动态地给对象添加额外职责,替代继承。
  • 应用:Java I/O流(如BufferedInputStream包装FileInputStream)。
  1. 适配器模式(Adapter)
  • 意图:将一个类的接口转换成客户期望的另一个接口。
  • 应用:兼容旧系统接口、第三方库适配。
  1. 桥接模式(Bridge)
  • 意图:将抽象部分与实现部分分离,使它们可以独立变化。
  • 应用:跨平台图形绘制、JDBC驱动。
  1. 组合模式(Composite)
  • 意图:将对象组合成树形结构以表示“部分-整体”的层次关系。
  • 应用:文件系统、组织架构图。
  1. 外观模式(Facade)
  • 意图:为复杂子系统提供统一的高层接口,简化客户端使用。
  • 应用:封装第三方API、Spring MVC的DispatcherServlet
  1. 享元模式(Flyweight)
  • 意图:通过共享技术有效支持大量细粒度对象。
  • 应用:文本编辑器中的字符对象、游戏中的粒子系统。

三、行为型模式(Behavioral Patterns)

关注点:对象之间的交互和职责分配。

  1. 观察者模式(Observer)
  • 意图:定义对象间的一对多依赖,当一个对象状态改变时,所有依赖者都会收到通知。
  • 应用:事件监听(如GUI事件)、消息队列。
  1. 策略模式(Strategy)
  • 意图:定义一系列算法,将每个算法封装起来,并使它们可以互换。
  • 应用:排序算法切换、支付方式选择。
  1. 状态模式(State)
  • 意图:允许对象在内部状态改变时改变其行为,看起来像是修改了类。
  • 应用:工作流引擎、游戏角色状态切换。
  1. 责任链模式(Chain of Responsibility)
  • 意图:将请求的发送者和接收者解耦,使多个对象都有机会处理请求。
  • 应用:Servlet过滤器链、异常处理链。
  1. 命令模式(Command)
  • 意图:将请求封装为对象,使请求的发送者和接收者解耦,并支持请求的排队、记录和撤销。
  • 应用:GUI按钮点击处理、数据库事务。
  1. 模板方法模式(Template Method)
  • 意图:定义算法的骨架,将一些步骤延迟到子类实现。
  • 应用:HttpServlet的doGet()/doPost()方法、JUnit测试框架。
  1. 迭代器模式(Iterator)
  • 意图:提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露该对象的内部表示。
  • 应用:Java集合框架中的Iterator接口。
  1. 访问者模式(Visitor)
  • 意图:将算法与对象结构分离,允许在不改变对象结构的前提下定义作用于这些对象的新操作。
  • 应用:编译器的语法树遍历、XML解析器。
  1. 中介者模式(Mediator)
  • 意图:定义一个中介对象来封装一系列对象之间的交互,使各对象不需要显式地相互引用。
  • 应用:聊天室、MVC架构中的Controller。
  1. 备忘录模式(Memento)
    • 意图:在不破坏封装性的前提下,捕获并外部化对象的内部状态,以便对象可以恢复到该状态。
    • 应用:游戏存档、文本编辑器的撤销功能。
  2. 解释器模式(Interpreter)
    • 意图:给定一个语言,定义它的文法表示,并定义一个解释器来解释该文法。
    • 应用:正则表达式解析、SQL查询解释。

四、其他常见模式

  1. MVC模式(Model-View-Controller)
  • 意图:将应用分为模型(数据)、视图(展示)和控制器(逻辑)三部分,解耦交互。
  • 应用:Web框架(如Spring MVC、Struts)、桌面应用。
  1. 委派模式(Delegate)
  • 意图:不亲自处理任务,而是委派给其他对象处理。
  • 应用:Spring的DispatcherServlet、JUnit的测试执行。
  1. 空对象模式(Null Object)
  • 意图:用空对象替代空引用,避免空指针异常。
  • 应用Collections.emptyList()、日志框架的空实现。
  1. 门面模式(Facade)
  • 意图:为子系统中的一组接口提供统一的高层接口,简化客户端使用。
  • 应用:封装第三方API、企业服务层。

设计模式的核心原则

  1. 开闭原则(Open/Closed Principle):对扩展开放,对修改关闭。
  2. 依赖倒置原则(Dependency Inversion):依赖抽象而非具体实现。
  3. 单一职责原则(Single Responsibility Principle):一个类只负责一个功能领域。
  4. 接口隔离原则(Interface Segregation Principle):客户端不应该依赖它不需要的接口。
  5. 里氏替换原则(Liskov Substitution Principle):子类可以替换父类而不影响程序正确性。
  6. 迪米特法则(Law of Demeter):一个对象应该对其他对象有最少的了解。

总结

设计模式是经验的总结,而非教条。使用时需结合具体场景,避免过度设计。建议通过阅读经典书籍(如《设计模式》《Effective Java》)和分析开源项目(如Spring、Hibernate)深入学习。

留下评论

您的邮箱地址不会被公开。 必填项已用 * 标注