【设计模式】享元模式——享元模式在Glide源码中的应用

在Glide源码中,BitmapPool是其核心组件之一,用于管理和重用Bitmap对象。BitmapPool用于缓存已经加载的Bitmap对象,当再次请求相同图片时,可以直接从缓存中获取,避免重复加载和解码。BitmapPool通过资源池管理Bitmap对象的生命周期,当图片不再需要显示时,将其放回BitmapPool,而不是立即销毁,从而减少对象的创建和销毁次数。

public class BitmapFactory {
    private final BitmapPool bitmapPool;

    public BitmapFactory(BitmapPool bitmapPool) {
        this.bitmapPool = bitmapPool;
    }

    public Bitmap getBitmap(int width, int height, Bitmap.Config config) {
        // 尝试从BitmapPool中获取已有的Bitmap对象
        Bitmap bitmap = bitmapPool.get(width, height, config);
        if (bitmap != null) {
            return bitmap;
        }
        // 如果不存在,则创建新的Bitmap对象并放入BitmapPool
        bitmap = Bitmap.createBitmap(width, height, config);
        bitmapPool.put(bitmap);
        return bitmap;
    }
}

无独有偶,RequestManager类也利用BitmapPool和享元模式

public class RequestManager {
    private final BitmapPool bitmapPool;

    public RequestManager(BitmapPool bitmapPool) {
        this.bitmapPool = bitmapPool;
    }

    public void loadImage(String url) {
        // 检查BitmapPool中是否已有该图片的Bitmap对象
        Bitmap bitmap = bitmapPool.get(url);
        if (bitmap != null) {
            // 如果存在,直接返回缓存中的对象
            displayImage(bitmap);
            return;
        }
        // 如果不存在,启动一个新的加载任务来加载图片
        loadFromNetwork(url);
    }

    private void loadFromNetwork(String url) {
        // 模拟网络加载图片的过程
        Bitmap bitmap = downloadBitmapFromUrl(url);
        // 将加载的图片放入BitmapPool
        bitmapPool.put(url, bitmap);
        displayImage(bitmap);
    }

    private Bitmap downloadBitmapFromUrl(String url) {
        // 模拟下载Bitmap的过程
        return Bitmap.createBitmap(100, 100, Bitmap.Config.ARGB_8888);
    }

    private void displayImage(Bitmap bitmap) {
        // 显示图片的逻辑
        System.out.println("Displaying image: " + bitmap);
    }
}

RequestManager负责处理所有的图片请求。当收到一个新的图片请求时,会先检查BitmapPool中是否已经有该图片的Bitmap对象。如果有,则直接返回缓存中的对象;否则,启动一个新的加载任务来加载图片,并将加载的图片放入BitmapPool。

上一篇:Java 如何做语音朗读:从文本到语音的实现


下一篇:CentOS 上安装各种应用的命令行总结