java设计模式

  1. 创建型模式

    • 单例模式(Singleton Pattern)
      • 定义和目的:确保一个类只有一个实例,并提供一个全局访问点来访问这个实例。就像是一个软件系统中的某些资源(如数据库连接池、日志记录器),只需要一个实例就能满足整个系统的需求,而且多个地方都能方便地获取和使用这个实例。
      • 实现方式:通常有懒汉式和饿汉式两种常见方式。懒汉式是在第一次调用获取实例的方法时才创建实例,需要考虑线程安全问题;饿汉式是在类加载时就创建好实例,是线程安全的,但可能会造成资源的提前占用。例如,在一个简单的日志记录器类中,采用单例模式可以保证整个应用程序只有一个日志记录对象来记录所有的日志信息。
    • 工厂模式(Factory Pattern)
      • 定义和目的 :工厂模式是一种创建对象的设计模式,它将对象的创建和使用分离。通过一个工厂类来负责创建对象,而不是在客户端代码中直接使用new关键字来创建对象。这样可以根据不同的条件(如输入参数、配置信息)来创建不同类型的对象,提高了代码的灵活性和可维护性。
      • 简单工厂、工厂方法和抽象工厂的区别与联系:简单工厂模式将对象创建逻辑封装在一个工厂类的方法中,根据传入的参数决定创建何种对象;工厂方法模式是在简单工厂的基础上,将工厂类抽象化,每个具体的工厂子类负责创建一种特定类型的对象;抽象工厂模式则是工厂模式的更高级形式,它可以创建一系列相关的对象,这些对象可能属于不同的产品族和产品等级结构。例如,在一个游戏开发中,游戏角色的创建可以使用工厂模式。简单工厂可以根据角色类型(如战士、法师)创建相应角色;工厂方法模式可以为每个角色类型定义一个专门的工厂子类来创建;抽象工厂模式可以同时创建角色及其相关的装备、技能等对象。
    • 建造者模式(Builder Pattern)
      • 定义和目的:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。当一个对象的构造过程很复杂,有很多可选参数或者步骤时,使用建造者模式可以让代码更加清晰。就像组装一台电脑,不同的用户可能有不同的配置需求(如 CPU、显卡、内存等不同),建造者模式可以根据用户的要求逐步构建出不同配置的电脑。
      • 实现步骤和优势:首先定义一个抽象的建造者类,其中包含构建产品各个部分的抽象方法;然后有具体的建造者类来实现这些方法,构建具体的产品部分;接着有一个指挥者类,它负责调用建造者的方法来按照特定的顺序构建产品;最后得到一个完整的产品对象。这种模式的优势在于可以精细地控制对象的构建过程,并且容易扩展和维护,能够应对复杂对象构建的变化。
  2. 结构型模式

    • 代理模式(Proxy Pattern)
      • 定义和目的:为其他对象提供一种代理以控制对这个对象的访问。代理对象可以在不改变原始对象(被代理对象)接口的情况下,对原始对象的访问进行控制,如在访问前进行权限检查、懒加载等操作。例如,在网络访问中,当访问一些受限制的资源时,代理服务器(代理对象)可以代替用户(客户端)向目标服务器(原始对象)请求资源,并且在这个过程中可以进行用户认证、缓存资源等操作。
      • 静态代理和动态代理的区别:静态代理是在编译时期就确定了代理类和被代理类的关系,代理类需要实现与被代理类相同的接口,并且为每个被代理的方法都编写代理逻辑;动态代理是在运行时动态地生成代理对象,它不需要为每个被代理类都编写一个代理类。在 Java 中,通过反射机制可以实现动态代理,这样可以更加灵活地处理多个不同类型的被代理对象。
    • 装饰器模式(Decorator Pattern)
      • 定义和目的:动态地给一个对象添加一些额外的职责。就像给一个基本的咖啡(对象)添加不同的配料(如牛奶、糖、奶油)来改变咖啡的口味(功能)。装饰器模式可以在不改变原有对象结构的情况下,通过包装对象来扩展其功能。
      • 实现方式和应用场景:首先定义一个抽象的组件类(被装饰的对象),然后有具体的组件子类实现这个抽象类;接着定义一个抽象的装饰器类,它和抽象组件类有相同的接口,并且包含一个对抽象组件类的引用;最后有具体的装饰器子类,在这些子类中可以重写抽象装饰器类的方法,在调用原有方法的基础上添加额外的功能。这种模式在图形界面组件扩展、输入 / 输出流处理等场景中有广泛的应用。
    • 适配器模式(Adapter Pattern)
      • 定义和目的:将一个类的接口转换成客户期望的另一个接口。使得原本由于接口不兼容而不能一起工作的类可以一起工作。就像不同国家的插头(接口)标准不同,需要一个转换插头(适配器)才能插入当地的插座(另一个接口)。
      • 对象适配器和类适配器的区别:对象适配器是通过组合的方式,将被适配对象作为适配器类的一个成员变量,在适配器类的方法中调用被适配对象的方法来实现适配;类适配器是通过继承的方式,让适配器类继承被适配类和目标接口,在适配器类中重写目标接口的方法来实现适配。这种模式在系统集成、软件升级等场景中经常用到,用于解决新老系统接口不兼容的问题。
  3. 行为型模式

    • 观察者模式(Observer Pattern)
      • 定义和目的:定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。当主题对象的状态发生变化时,会通知所有的观察者对象,使得它们能够自动更新自己的状态。就像新闻订阅系统,报社(主题对象)发布新闻(状态改变),订阅者(观察者对象)会收到通知并看到新闻内容(更新状态)。
      • 实现方式和应用场景:首先定义一个抽象的主题类,其中包含添加观察者、删除观察者和通知观察者的方法;然后有具体的主题子类实现这些方法;接着定义一个抽象的观察者类,其中包含一个更新方法,用于接收主题对象的通知并更新自己的状态;最后有具体的观察者子类实现这个更新方法,根据主题对象的变化做出具体的反应。这种模式在事件处理系统、消息队列等场景中有广泛的应用。
    • 策略模式(Strategy Pattern)
      • 定义和目的:定义了一系列的算法,将每个算法封装起来,并且使它们可以相互替换。就像在一个导航软件中,有多种路线规划策略(如最短时间、最短距离、避开拥堵等),可以根据用户的需求(如当前路况、用户偏好)选择不同的策略。
      • 实现步骤和优势:首先定义一个抽象的策略类,其中包含一个抽象的算法方法;然后有具体的策略子类实现这个抽象方法,每个子类代表一种具体的算法;接着定义一个上下文类,它包含一个对策略类的引用,通过调用策略类的方法来执行具体的算法。这种模式的优势在于可以灵活地切换算法,提高了代码的可维护性和可扩展性,并且符合开闭原则(对扩展开放,对修改关闭)。
    • 模板方法模式(Template Method Pattern)
      • 定义和目的:在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法模式使得子类可以在不改变算法整体结构的情况下,重新定义算法中的某些步骤。就像泡茶和泡咖啡的过程,都有相似的步骤(如烧水、冲泡、倒入杯中),可以定义一个抽象的模板方法来描述这个过程,然后在泡茶和泡咖啡的子类中实现具体的步骤(如茶和咖啡不同的冲泡方式)。
      • 实现方式和应用场景:首先定义一个抽象的父类,其中包含一个模板方法,这个模板方法定义了算法的基本步骤顺序,其中一些步骤是具体方法,另一些步骤是抽象方法;然后有具体的子类继承这个抽象父类,在子类中实现抽象方法,从而定制具体的算法。这种模式在框架开发、工作流引擎等场景中有广泛的应用,用于提供一个通用的算法框架,让用户可以根据具体需求进行定制。
相关推荐
海特伟业13 小时前
隧道调频广播覆盖-隧道调频广播无线覆盖系统建设要点、难点分析与解决应对
运维·设计模式
sg_knight14 小时前
设计模式实战:享元模式(Flyweight)
python·设计模式·享元模式·flyweight
Swift社区16 小时前
AI 时代,ArkUI 的设计模式会改变吗?
人工智能·设计模式
数据中穿行16 小时前
访问者设计模式全方位深度解析
设计模式
宁雨桥17 小时前
前端设计模式面试题大全
前端·设计模式
数据中穿行18 小时前
迭代器设计模式全方位深度解析
设计模式
数据中穿行18 小时前
观察者设计模式全方位深度解析
设计模式
程序员Terry19 小时前
别老写重复代码了!模版方法模式一次讲透
java·设计模式
数据中穿行19 小时前
建造者模式全方位深度解析
设计模式