Java 之 设计模式

发布于:2025-08-10 ⋅ 阅读:(11) ⋅ 点赞:(0)

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等)创建对应的资源加载器


网站公告

今日签到

点亮在社区的每一天
去签到