当前位置: 首页 > 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.dtcms.com/a/321163.html

相关文章:

  • Scratch编程:枪战游戏(附源码)
  • C++信息学奥赛一本通-第一部分-基础一-第3章-第1节
  • 【深度学习新浪潮】近三年高精度大规模三维实景重建研究进展(2022-2025)
  • Java零散知识点
  • Webpack 核心配置与最佳实践指南
  • cAdvisor 容器监控软件学习
  • 移动端app专项测试
  • 园区应急调度系统的核心功能
  • 塔罗耳语:免费在线AI塔罗牌占卜工具
  • 1-10〔 OSCP ◈ 研记 〕❘ 信息收集▸主动采集H:SNMP基础
  • WinForm利用 RichTextBox组件实现输出各种颜色字体日志信息
  • MMBFJ310LT1G一款N沟道JFE 晶体管适用于高频放大器和振荡器等射频应用MMBFJ310LT1
  • STM32CubeMX(十二)SPI驱动W25Qxx(Flash)
  • VUE+SPRINGBOOT从0-1打造前后端-前后台系统-视频列表与视频播放
  • 【嵌入式C语言】
  • C语言:结构体
  • mac电脑解决在不同项目需要频繁手动切换node版本的困扰
  • Autosar AP功能组状态和模型进程是否预定义后不改变了?
  • Mac 电脑放在环境变量中的通用脚本
  • 从浅拷贝到深拷贝:C++赋值运算符重载的核心技术
  • SITIME汽车时钟发生器Chorus保障智能汽车安全
  • 《告别Bug!GDB/CGDB调试实战指南》
  • 「iOS」————优先级反转
  • 解决Docker部署的MySQL8错误日志里面的 mbind: Operation not permitted 问题
  • 构建安全 Web 应用:从用户认证与授权到 JWT 原理解析
  • python使用python-docx自动化操作word
  • 【杂谈】-逆缩放悖论:为何更多思考会让AI变“笨“?
  • Numpy科学计算与数据分析:Numpy布尔索引与花式索引实战
  • 一种对白点进行多重加权并利用三角剖分插值微调白平衡增益的白平衡矫正算法
  • RAG问答系统:Spring Boot + ChromaDB 知识库检索实战