Android源码看设计模式(五)--------基于创建者模式的Glide相关分析

创建者模式

定义:

将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示

使用场景

用户在不知道内部构建细节的情况下,可以精细的控制对象的构造流程。

创建者模式结构

这里写图片描述

  • Dirextor: 指挥者类
  • Builder:抽象Builder类,规范产品的组建
  • ConcreteBulider: 抽象Builder类的实现类,实现抽象Builder类定义的所有方法,并且返回一个组建好的对象
  • Product: 产品类

但是上面的比较抽象,我们结合实际开发来分析一下


  • Dirextor:产品经理,把握产品的总体设计,负责和客户沟通
  • Builder:技术主管,不实际开发,但是需要清楚产品的所有实现步骤,体现在代码中就是一个抽象接口,拥有所有的实现方法
  • ConcreteBulider:程序员,根据技术主管提供的实现步骤,具体实现逻辑,具体表现为,实现技术主管的接口,编写具体逻辑代码
  • Product: 产品类,这个没有什么好说的
    这里写图片描述
    关于上面的结构图可以通俗的说明,加入客户告诉产品经理说需要开发一款通讯软件,那么产品经理和客户进行协商,说开发QQ吧,那么接下来就是产品经理和技术主管的沟通,就产品实现而言,确定开发的模块和实现的步骤,比如说有“通讯模块”、“文件上传模块”,值得一提的是技术主管并不实际开发,只是“嘴上形式”,之后技术主管把开发步骤和模块告知程序员,由程序员负责实际开发,完成产品。但是在实际开发中,Dirextor的角色通常被忽略,而是直接使用Builder来进行对象的组装,这个Builder通常为链式调用,它的关键点是每个setXX()方法都返回自身,即return this,形如:

new TestBuilder().setA(“A”).setB(“B”).setC(“C”).create();

Glide使用方式

我们知道Glide是一个强大的图片加载框架,使用形式方便简单:

   Glide.with(this)
        .load("url")
        .error(R.drawable.default_error)
        .skipMemoryCache(true)
        .into(new ImageView(this));

其实这里就可以体现我们上面所说的创建者模式的链式调用,我们接下来看一看Glide的源码

//load() 
public DrawableTypeRequest<String> load(String string) {
        return (DrawableTypeRequest<String>) fromString().load(string);
}

//skipMemoryCache()
 public DrawableRequestBuilder<ModelType> skipMemoryCache(boolean skip) {
        super.skipMemoryCache(skip);
        return this;
 }
    ....

我们可以看到这些方法最终都是return this,返回的是DrawableRequestBuilder类型,这里就可以说明Glide的模式确实是链式调用的创建者模式,那么我们接着来看DrawableRequestBuilder

//继承GenericRequestBuilder
public class DrawableRequestBuilder<ModelType>
        extends GenericRequestBuilder<ModelType, ImageVideoWrapper, GifBitmapWrapper, GlideDrawable>
        implements BitmapOptions, DrawableOptions {
         .......

DrawableRequestBuilder是继承GenericRequestBuilder,那么接着进入父类

public class GenericRequestBuilder<ModelType, DataType, ResourceType, TranscodeType> implements Cloneable {
    protected final Class<ModelType> modelClass;
    protected final Context context;
    protected final Glide glide;
    protected final Class<TranscodeType> transcodeClass;
    protected final RequestTracker requestTracker;
    protected final Lifecycle lifecycle;
    private ChildLoadProvider<ModelType, DataType, ResourceType, TranscodeType> loadProvider;

    private ModelType model;
    private Key signature = EmptySignature.obtain();
    // model may occasionally be null, so to enforce that load() was called, set a boolean rather than relying on model
    // not to be null.
    private boolean isModelSet;
    private int placeholderId;
    private int errorId;
    private RequestListener<? super ModelType, TranscodeType> requestListener;
    private Float thumbSizeMultiplier;
    private GenericRequestBuilder<?, ?, ?, TranscodeType> thumbnailRequestBuilder;
    private Float sizeMultiplier = 1f;
    private Drawable placeholderDrawable;
    private Drawable errorPlaceholder;
    private Priority priority = null;
    private boolean isCacheable = true;
    private GlideAnimationFactory<TranscodeType> animationFactory = NoAnimation.getFactory();
    private int overrideHeight = -1;
    private int overrideWidth = -1;
    private DiskCacheStrategy diskCacheStrategy = DiskCacheStrategy.RESULT;
    private Transformation<ResourceType> transformation = UnitTransformation.get();
    private boolean isTransformationSet;
    private boolean isThumbnailBuilt;
    private Drawable fallbackDrawable;
    private int fallbackResource;

    .......
//load()
  public GenericRequestBuilder<ModelType, DataType, ResourceType, TranscodeType> load(ModelType model) {
        this.model = model;
        isModelSet = true;
        return this;
    }

//skipMemoryCache()
  public GenericRequestBuilder<ModelType, DataType, ResourceType, TranscodeType> skipMemoryCache(boolean skip) {
        this.isCacheable = !skip;

        return this;
    }

我们可以看到GenericRequestBuilder中的方法,是设置Glide的相关属性,另外AlertDialog也是典型的创建者模式,我们可以根据具体需求自定义需求,这就是创建者模式的真正本意

猜你喜欢

转载自blog.csdn.net/qq_33768280/article/details/80960746