从ImageLoader看设计模式

建造者模式

最明显的是配置ImageLoader参数的时候,使用了建造者模式

public static void initImageLoader(Context context) {
        // This configuration tuning is custom. You can tune every option, you may tune some of them,
        // or you can create default configuration by
        //  ImageLoaderConfiguration.createDefault(this);
        // method.
        ImageLoaderConfiguration.Builder config = new ImageLoaderConfiguration.Builder(context);
        config.threadPriority(Thread.NORM_PRIORITY - 2);
        config.denyCacheImageMultipleSizesInMemory();
        config.diskCacheFileNameGenerator(new Md5FileNameGenerator());
        config.diskCacheSize(50 * 1024 * 1024); // 50 MiB
        config.tasksProcessingOrder(QueueProcessingType.LIFO);
        config.writeDebugLogs(); // Remove for release app

        // Initialize ImageLoader with configuration.
        ImageLoader.getInstance().init(config.build());
    }

它是一个静态内部类,调用build后就会返回这个配置

public ImageLoaderConfiguration build() {
            initEmptyFieldsWithDefaultValues();
            return new ImageLoaderConfiguration(this);
        }

建造者模式的好处,当你有大量参数需要设置的时候可以考虑使用。uml类图如下
从ImageLoader看设计模式_第1张图片
就是我们抽象一个参数设置类,然后对他进行设置,设设置完后再扔入需要构造对象的构造器中,android中AlertDialog也是是用了这个设计模式,
优点:可以避免大量的构造器,比如我们自定义view一样,至少要写4个构造器,假设我们配置参数有10个以上,全部传入构造器就会显得比较臃肿

单例模式

ImageLoader用就是比较典型DCL的方式

public static ImageLoader getInstance() {
        if (instance == null) {
            synchronized (ImageLoader.class) {
                if (instance == null) {
                //第二重判断空是为了防止两个线程同时进入第一层if
                //不进行判空会出现多个实例情况
                    instance = new ImageLoader();
                }
            }
        }
        return instance;
    }

其他获得单例方式除饱汉和饿汉外,静态内部类和枚举都可以用来作为获取单例的方式

装饰器模式

先上类图
从ImageLoader看设计模式_第2张图片
个人觉得主要用于扩展类,给类添加功能(装饰)的时候可以使用,imageLoader有几个类都用到了装饰器模式
LimitedAgeMemoryCache是MemoryCache的装饰者,相当于为MemoryCache添加了一个特性。
FuzzyKeyMemoryCache也是。
ContentLengthInputStream是InputStream的装饰者,可以通过available()函数得到InputStream对应数据源的长度,

其实javaIO流也是有用到装饰模式的,比如FilterInputStream,

策略模式

从ImageLoader看设计模式_第3张图片
也就是ImageLoader的缓存策略了,ImageLoader分别有两大缓存接口分别是DiskCache和MemoryCache。分别对应图中的Stategy接口,和他们的实现类就是具体策略,而他们的持有者就是ImageLoaderConfiguration,而ImageLoaderConfiguration又是提供给Imageloader调用的,配置的时候设置不同的策略

你可能感兴趣的:(android)