当前位置: 首页 > news >正文

Java 之 设计模式

1.单例模式

1. ​​饿汉式(Eager Initialization)​
  • ​核心原理​​:类加载时立即创建实例,通过静态变量直接初始化。

  • ​代码示例​​:

public class Singleton {private static final Singleton INSTANCE = new Singleton();private Singleton() {} // 私有构造public static Singleton getInstance() {return INSTANCE;}
}
  • ​特点​​:

    • ✅ ​​线程安全​​:JVM 类加载机制保证唯一实例。

    • ❌ ​​非延迟加载​​:实例在类加载时创建,若未被使用则浪费资源。

  • ​适用场景​​:实例小、启动时即需使用的场景(如配置管理器)

2. ​​懒汉式(Lazy Initialization)​
(1) 基础版(线程不安全)
  • ​代码示例​​:

  • public class Singleton {private static Singleton instance;private Singleton() {}public static Singleton getInstance() {if (instance == null) {instance = new Singleton(); // 多线程下可能重复创建}return instance;}
    }

    ​问题​​:多线程并发时可能创建多个实例

3. ​​双重检查锁(Double-Checked Locking, DCL)​

     volatile在DCL中的两个核心作用:禁止指令重排序和保证内存可见性​

  • ​核心优化​​:减少同步次数,兼顾性能与线程安全。

  • ​代码示例​​:

public class Singleton {private static volatile Singleton instance;private Singleton() {}public static Singleton getInstance() {if (instance == null) {synchronized (Singleton.class) {if (instance == null) {instance = new Singleton();}}}return instance;}
}

关键点​​:

  • ✅ ​​延迟加载​​:实例在首次调用时创建。

  • ✅ ​​高效同步​​:仅首次创建时加锁。

  • ⚠️ ​​需 volatile​​:防止指令重排序导致未初始化对象被使用(JDK 1.5+ 生效)

4. ​​静态内部类(Static Inner Class)​
  • ​原理​​:利用 JVM 类加载机制,内部类首次调用时才加载并初始化实例。

  • ​代码示例​​:

public class Singleton {private Singleton() {}private static class Holder {static final Singleton INSTANCE = new Singleton();}public static Singleton getInstance() {return Holder.INSTANCE;}
}
  • 点​​:

    • ✅ ​​线程安全​​:类加载过程由 JVM 保证同步。

    • ✅ ​​延迟加载​​:无额外同步开销。

  • ​局限​​:无法通过参数初始化实例

2.生产者-消费者模式

生产者-消费者模式是一种经典的并发设计模式,用于解决生产者和消费者线程之间的资源协作问题。其核心是​​通过共享缓冲区(BlockingQueue)解耦生产与消费逻辑​​,平衡两者的处理速度差异。以下是该模式的实现方式、关键要点及最佳实践

1.核心实现方式​

1. ​​基础版:wait()/notifyAll()

通过 synchronized块和 wait()/notifyAll()手动控制线程协作

public class Buffer {private Queue<Integer> queue = new LinkedList<>();private int capacity = 10;public synchronized void produce(int value) throws InterruptedException {while (queue.size() == capacity) { // 缓冲区满时等待wait();}queue.offer(value);notifyAll(); // 唤醒所有等待线程}public synchronized int consume() throws InterruptedException {while (queue.isEmpty()) { // 缓冲区空时等待wait();}int value = queue.poll();notifyAll(); // 唤醒生产者return value;}
}
2.核心组件与原理​
  1. ​生产者​

    • 负责生成数据(如网络请求结果、传感器数据)并存入缓冲区。

    • 当缓冲区满时,生产者线程自动阻塞(避免资源浪费)。

  2. ​消费者​

    • 从缓冲区取出数据并处理(如更新 UI、保存到数据库)。

    • 当缓冲区空时,消费者线程自动阻塞(避免空转)。

  3. ​缓冲区​

    • 作为数据中转站,通常用​​线程安全队列​​实现(如 BlockingQueue)。

    • 特性:容量限制、线程安全的存取操作(put()/take())。

  4. ​同步机制​

    • 确保生产者和消费者不会同时操作缓冲区导致数据竞争(如队列空/满时的阻塞唤醒)

3.Android 典型应用场景​
  1. ​异步任务管理​

    • 生产者:后台线程下载图片 → 消费者:主线程更新 UI。

    • 示例:HandlerThreadHandler实现任务队列(生产者投递任务,Looper消费任务)。

  2. ​数据流处理​

    • 生产者:摄像头采集帧 → 消费者:子线程进行图像识别。

  3. ​高并发请求控制​

    • 限制同时处理的网络请求数量(如线程池任务队列。

  4. ​跨进程通信​

    • 通过 IntentService或 WorkManager实现后台任务生产与消费

3.工厂模式

1. ​​简单工厂模式(静态工厂)​
  • ​核心​​:一个工厂类根据参数创建不同对象。

  • ​Android应用​​:

    • BitmapFactory:通过decodeResource()decodeFile()等方法,根据资源类型自动创建Bitmap,隐藏JPEG/PNG等格式的解码细节。

    • ​通知创建​​:统一工厂根据类型生成不同样式通知(如基础通知、大图通知)。


 2. ​​工厂方法模式(子类决策)​
  • ​核心​​:定义抽象工厂接口,由子类实现具体对象创建。

  • ​Android应用​​:

    • LayoutInflater

      • 系统通过onCreateView()抽象方法,让子类决定如何创建View。

      • ​自定义场景​​:通过setFactory2()替换系统控件(如全局将TextView替换为AppCompatTextView),实现兼容性适配。

    • ​RecyclerView​​:onCreateViewHolder()由子类决定创建哪种ViewHolder,解耦视图类型与适配器逻辑。


 3. ​​抽象工厂模式(产品家族)​
  • ​核心​​:创建一组相关对象(如整套UI组件)。

  • ​Android应用​​:

    • Resources体系:根据设备配置(分辨率、语言)自动加载匹配的Drawable、字符串等资源,不同ResourcesImpl生产当前环境所需的资源家族。

    • ​主题切换​​:为深色/浅色模式提供配套的按钮、文本框等UI组件。


  4. ​​开源框架中的应用​
  • ​Retrofit​​:Converter.Factory根据接口返回类型选择数据解析器(如GsonConverterFactory)。

  • ​Glide​​:ModelLoaderFactory根据数据类型(URL、File等)创建对应的资源加载器

http://www.lryc.cn/news/614784.html

相关文章:

  • Python day38
  • SVM算法实战应用
  • 【感知机】感知机(perceptron)学习算法例题及详解
  • 政治社会时间线
  • 为什么输入 URL 后会显示页面?HTTP 协议的 “幕后操作”
  • JDK、eclipse的安装,配置JDK、Tomcat并使用eclipse创建项目
  • Cursor CLI 来了,准备 Build anything
  • latex基础
  • Vue 路由跳转
  • Redis数据组织方式
  • 第39周——训练自己的数据集
  • Vue 组件化开发
  • 零基础小白如何使用QGIS制作研究区地形区位图教程
  • SQL聚合函数:SUM与COUNT的区别
  • 算法训练之字符串
  • 04--模板初阶(了解)
  • 常见数据结构介绍(顺序表,单链表,双链表,单向循环链表,双向循环链表、内核链表、栈、队列、二叉树)
  • VMware使用NAT模式,使本机与虚拟机在不同的网络,并且虚拟机可以上网
  • VSCode 禁用更新检查的方法
  • C++归并排序
  • Flutter开发 Switch、SwitchListTile的基本使用
  • 机器学习概念1
  • 关于 Rust 异步(无栈协程)的相关疑问
  • 书生浦语第五期-L1G3-LMDeploy 课程
  • AI入门学习--如何对RAG测试
  • 讲一讲@ImportResource
  • 触觉导航新突破:Contactile 触觉传感器推动机器人 “零示教” 实现复杂曲面作业
  • 如何解决pip安装报错ModuleNotFoundError: No module named ‘transformers’问题
  • 线程同步相关知识
  • 构建高可用架构:ZDNS GSLB 在多数据中心场景下的应用与 F5 替换实践