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

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.xdnf.cn/news/17306.html

相关文章:

  • Python名称映射技术:基于序列元素的高级访问模式详解
  • [科普] AI加速器架构全景图:从GPU到光计算的算力革命
  • 豆包新模型+PromptPilot:AI应用开发全流程实战指南
  • 【C++高阶五】mapset对红黑树的封装
  • Nestjs框架: 接口安全与响应脱敏实践 --- 从拦截器到自定义序列化装饰器
  • 【昇腾】Atlas 500 A2 智能小站制卡从M.2 SATA盘启动Ubuntu22.04系统,重新上电卡死没进系统问题处理_20250808
  • 大语言模型提示工程与应用:提示词基础使用方式
  • Redis原理,命令,协议以及异步方式
  • 分布式膛压应变测量系统
  • 中国电信清华:大模型驱动的具身智能发展与挑战综述
  • BGP综合实验
  • 代码随想录算法训练营第三十八天、三十九天|动态规划part11、12
  • 考研复习-计算机组成原理-第四章-指令系统
  • 机器人焊机智能流量调节
  • 内容分发机制研究:实测一款多源短视频聚合App
  • isulad + harbor私有仓库登录
  • 从安卓兼容性困境到腾讯Bugly的救赎:全链路崩溃监控解决方案-卓伊凡|bigniu
  • 机器学习概念1
  • STM32HAL 快速入门(二):用 CubeMX 配置点灯程序 —— 从工程生成到 LED 闪烁
  • 服务器登上去,显示 failed to send WATCHDOG 重启有效吗?
  • Android 之 ANR问题的全面解析与优化方案
  • Godot ------ 制作属于自己的卡牌
  • 讲一讲@ImportResource
  • C++ WonderTrader源码分析之自旋锁实现
  • 宁商平台税务新举措:合规护航,服务暖心
  • 视频质量检测中准确率↑32%:陌讯多模态评估方案实战解析
  • Web Worker 性能革命:让浏览器多线程为您的应用加速
  • 使用 Gulp 替换 XML 文件内容
  • 解决MinIO上传图片后返回URL无法访问的问题
  • 从深度伪造到深度信任:AI安全的三场攻防战