Java23种设计模式介绍与说明

关于我:IT从业5年,主要擅长Java技术栈相关内容,致力于分享Java技术相关的文章,关注我不迷路,一起努力提升技术人的核心能力。交个朋友吧,我是一个爱好广泛,灵魂有趣的人~

私我,可免费领取Java学习资源~

————————分割线————————

一、分类与核心模式

1. 创建型模式(5种)
目的:解决对象创建的复杂性,隐藏创建细节,提高代码复用性。

  • 单例模式(Singleton)
    • 功能:确保一个类只有一个实例,提供全局访问点。
    • 实现:
      • 饿汉式:类加载时初始化,线程安全但可能浪费内存(如private static final Singleton INSTANCE = new Singleton();)。
      • 懒汉式:延迟加载,需同步锁保证线程安全(如synchronized getInstance())。
      • 双重校验锁:减少同步开销(如volatile关键字确保可见性)。
      • 枚举式:最安全的实现,天然防止反射攻击(如public enum Singleton { INSTANCE; })。
    • 场景:全局配置、线程池、数据库连接池。
    • 原则:开闭原则,依赖倒置。
  • 工厂方法模式(Factory Method)
    • 功能:定义接口,由子类决定实例化对象。
    • 实现:抽象工厂类定义create()方法,子类实现具体逻辑。
    • 场景:动态创建对象(如邮件/短信发送器)。
    • 原则:开闭原则,依赖倒置。
  • 抽象工厂模式(Abstract Factory)
    • 功能:创建相关对象的家族,提供统一接口。
    • 实现:抽象工厂接口定义多个产品族的创建方法。
    • 场景:跨平台UI组件(如Windows/Mac风格)。
    • 原则:合成复用,接口隔离。
  • 建造者模式(Builder)
    • 功能:分步骤构建复杂对象,分离构建与表示。
    • 实现:Director类控制流程,Builder类定义构建步骤(如Director.build())。
    • 场景:MyBatis的SQLSession构建。
    • 原则:开闭原则,合成复用。
  • 原型模式(Prototype)
    • 功能:通过克隆现有对象创建新实例。
    • 实现:浅拷贝(默认Object.clone())或深拷贝(自定义逻辑)。
    • 场景:高开销对象的快速克隆(如图形编辑器)。
    • 原则:合成复用,接口隔离。

2. 结构型模式(7种)
目的:优化类与对象的结构,增强可扩展性与复用性。

  • 适配器模式(Adapter)
    • 功能:转换接口,兼容不兼容的类。
    • 实现:
      • 类适配器:继承被适配类并实现目标接口(如ClassLoggerAdapter extends LegacyLogger implements ModernLogger)。
      • 对象适配器:通过组合被适配对象(如ObjectAdapter持有Adaptee实例)。
    • 场景:JDK的InputStreamReader将字节流转为字符流。
    • 原则:里氏替换,接口隔离。
  • 装饰器模式(Decorator)
    • 功能:动态扩展对象功能。
    • 实现:通过组合添加职责(如BufferedInputStream增强输入流的缓冲能力)。
    • 场景:JDK的BufferedXxx系列类。
    • 原则:合成复用,接口隔离。
  • 代理模式(Proxy)
    • 功能:控制对对象的访问,增强或限制行为。
    • 实现:
      • 静态代理:手动编写代理类。
      • 动态代理:Spring AOP通过Proxy.newProxyInstance()实现。
    • 场景:远程调用、安全控制(如拦截非法访问)。
    • 原则:依赖倒置,接口隔离。
  • 外观模式(Facade)
    • 功能:简化复杂子系统的接口。
    • 实现:提供高层接口封装底层细节(如ZipFile封装压缩文件操作)。
    • 场景:Java的ZipFile、Spring的ApplicationContext
    • 原则:迪米特法则,合成复用。
  • 桥接模式(Bridge)
    • 功能:分离抽象与实现,独立变化。
    • 实现:通过组合代替继承(如ColorShape的组合)。
    • 场景:JDK的ColorShape的组合。
    • 原则:开闭原则,合成复用。
  • 组合模式(Composite)
    • 功能:处理部分-整体结构,统一访问方式。
    • 实现:树形结构中节点与叶子的统一操作(如FileDirectory继承Component接口)。
    • 场景:文件系统的目录与文件管理。
    • 原则:里氏替换,接口隔离。
  • 享元模式(Flyweight)
    • 功能:共享细粒度对象,减少内存消耗。
    • 实现:外部状态与内部状态分离(如共享文本块)。
    • 场景:游戏中的大量小兵复用。
    • 原则:合成复用,接口隔离。

3. 行为型模式(11种)
目的:描述对象间协作与算法封装,提升系统灵活性。

  • 策略模式(Strategy)
    • 功能:定义算法族,可动态替换。
    • 实现:通过接口封装算法,客户端切换实现(如PaymentGateway接口与具体实现类)。
    • 场景:支付方式选择(信用卡/支付宝)。
    • 原则:开闭原则,接口隔离。
  • 模板方法模式(Template Method)
    • 功能:定义算法骨架,延迟子类实现。
    • 实现:抽象类定义骨架,子类填充步骤(如Thread.run())。
    • 场景:JDK的Thread类。
    • 原则:开闭原则,里氏替换。
  • 观察者模式(Observer)
    • 功能:一对多依赖,状态变化自动通知。
    • 实现:主题(Subject)维护观察者列表,通知变更(如EventBus)。
    • 场景:GUI事件监听、股票价格监控。
    • 原则:迪米特法则,接口隔离。
  • 责任链模式(Chain of Responsibility)
    • 功能:请求沿链传递,直到被处理。
    • 实现:链式调用,每个节点决定是否处理或传递(如日志级别过滤)。
    • 场景:日志系统、权限验证。
    • 原则:开闭原则,合成复用。
  • 命令模式(Command)
    • 功能:封装请求为对象,支持撤销/重做。
    • 实现:命令接口、具体命令、调用者、接收者(如UndoManager)。
    • 场景:编辑器的撤销功能。
    • 原则:合成复用,接口隔离。
  • 状态模式(State)
    • 功能:对象行为随状态变化。
    • 实现:状态类实现不同行为,上下文切换状态(如Order状态流转)。
    • 场景:订单状态(待支付→已发货→已完成)。
    • 原则:开闭原则,里氏替换。
  • 备忘录模式(Memento)
    • 功能:保存对象状态,支持恢复。
    • 实现:管理者(Originator)保存状态快照(如Memento类)。
    • 场景:游戏存档、事务回滚。
    • 原则:封装性,接口隔离。
  • 迭代器模式(Iterator)
    • 功能:顺序访问聚合对象,不暴露内部结构。
    • 实现:聚合类提供迭代器接口(如ListIterator)。
    • 场景:遍历集合(如JDK的Iterator)。
    • 原则:合成复用,接口隔离。
  • 中介者模式(Mediator)
    • 功能:集中管理对象交互,降低耦合。
    • 实现:中介者协调多个对象通信(如ChatRoom处理消息)。
    • 场景:聊天室消息转发。
    • 原则:迪米特法则,合成复用。
  • 访问者模式(Visitor)
    • 功能:在不修改类的前提下添加操作。
    • 实现:访问者接口定义操作,元素接受访问者(如AST遍历)。
    • 场景:数据统计、语法分析。
    • 原则:开闭原则,接口隔离。
  • 解释器模式(Interpreter)
    • 功能:解释简单语言文法。
    • 实现:定义文法规则,解释器执行(如SQL解析器)。
    • 场景:表达式解析、脚本执行。
    • 原则:合成复用,接口隔离。

二、设计原则与模式映射

23种模式遵循以下核心原则:

  1. 开闭原则:对扩展开放,对修改关闭(如工厂模式)。

  2. 里氏替换原则:子类可替换父类而不影响系统(如策略模式)。

  3. 依赖倒置原则:依赖抽象而非具体实现(如接口编程)。

  4. 合成复用原则:优先使用组合而非继承(如装饰器模式)。

  5. 迪米特法则:减少对象间交互(如观察者模式)。

  6. 接口隔离原则:避免臃肿接口(如策略模式的独立算法)。


三、应用场景总结

  • 创建型模式:解决对象创建的不确定性,如单例控制全局资源。
  • 结构型模式:优化代码结构,如适配器兼容不同接口。
  • 行为型模式:协调对象协作,如观察者模式实现事件通知。

四、学习建议

  1. 结合源码实践:分析Spring的工厂模式、JDK的代理机制。

  2. 场景驱动:通过实际项目(如电商支付、日志系统)应用模式。

  3. 对比分析:理解相似模式的区别(如适配器与装饰器)。
    如需具体模式的代码实现或深入分析,可参考相关技术文档或源码仓库。

你可能感兴趣的:(#,Java知识点,java,笔记,学习,开发语言,算法)