创建者模式
定义:
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示
使用场景
用户在不知道内部构建细节的情况下,可以精细的控制对象的构造流程。
创建者模式结构
- 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也是典型的创建者模式,我们可以根据具体需求自定义需求,这就是创建者模式的真正本意