时间:2021-05-20
在日常开发过程中时常需要用到设计模式,但是设计模式有23种,如何将这些设计模式了然于胸并且能在实际开发过程中应用得得心应手呢?和我一起跟着《Android源码设计模式解析与实战》一书边学边应用吧!
今天我们要讲的是Builder模式(建造者模式)
定义
将一个复杂对象的构建和它的表示分离,使得同样的构建过程可以创建不同的表示
使用场景
当初始化一个对象特别复杂时,如参数多,且很多参数都具有默认值时
相同的方法,不同的执行顺序,产生不同的事件结果时
多个部件或零件,都可以装配到一个对象中,但是产生的运行效果又不相同时
产品类非常复杂,或者产品类中的调用顺序不同产生了不同的作用,这个时候使用建造者模式非常合适
使用例子
AlertDialog
universal-image-loader
实现
实现的要点
简言之,就是把需要通过set方法来设置的多个属性封装在一个配置类里面
每个属性都应该有默认值
具体的set方法放在配置类的内部类Builder类中,并且每个set方法都返回自身,以便进行链式调用
实现方式
下面以我们的图片加载框架ImageLoder为例来看看Builder模式的好处
未采用Builder模式的ImageLoader
public class ImageLoader { //图片加载配置 private int loadingImageId; private int loadingFailImageId; // 图片缓存,依赖接口 ImageCache mImageCache = new MemoryCache(); // 线程池,线程数量为CPU的数量 ExecutorService mExecutorService = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()); //省略单例模式实现 /** * 设置图片缓存 * @param cache */ public void setImageCache(ImageCache cache) { mImageCache = cache; } /** * 设置图片加载中显示的图片 * @param resId */ public Builder setLoadingPlaceholder(int resId) { loadingImageId = resId; } /** * 设置加载失败显示的图片 * @param resId */ public Builder setLoadingFailPlaceholder(int resId) { loadingFailImageId = resId; } /** * 显示图片 * @param imageUrl * @param imageView */ public void displayImage(String imageUrl, ImageView imageView) { Bitmap bitmap = mImageCache.get(imageUrl); if (bitmap != null) { imageView.setImageBitmap(bitmap); return; } // 图片没有缓存,提交到线程池下载 submitLoadRequest(imageUrl, imageView); } /** * 下载图片 * @param imageUrl * @param imageView */ private void submitLoadRequest(final String imageUrl, final ImageView imageView) { imageView.setImageResource(loadingImageId); imageView.setTag(imageUrl); mExecutorService.submit(new Runnable() { @Override public void run() { Bitmap bitmap = downloadImage(imageUrl); if (bitmap == null) { imageView.setImageResource(loadingFailImageId); return; } if (imageUrl.equals(imageView.getTag())) { imageView.setImageBitmap(bitmap); } mImageCache.put(imageUrl, bitmap); } }); } /** * 下载图片 * @param imageUrl * @return */ private Bitmap downloadImage(String imageUrl) { Bitmap bitmap = null; //省略下载部分代码 return bitmap; }}从上面的代码中我们可以看出,每当需要增加一个设置选项的时候,就需要修改ImageLoader的代码,违背了开闭原则,而且ImageLoader中的代码会越来越多,不利于维护
下面我们来看看如何用Builder模式来改造ImageLoader
首先是把ImageLoader的设置都放在单独的配置类里,每个set方法都返回this,从而达到链式调用的目的
ImageLoader的修改
调用形式,是不是很熟悉?
总结
在构建的对象需要很多配置的时候可以考虑Builder模式,可以避免过多的set方法,同时把配置过程从目标类里面隔离出来,代码结构更加清晰
Builder模式比较常用的实现形式是通过链式调用实现,这样更简洁直观
源码地址:https://github.com/snowdream1314/ImageLoader
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
本文实例讲述了Android编程设计模式之Builder模式。分享给大家供大家参考,具体如下:一、介绍Builder模式是一步一步创建一个复杂对象的创建型模式,
前言Builder设计模式也叫做构建者模式或者建造者模式,名字只是一种叫法,当聊起三种名称的时候知道是怎么回事就行Builder设计模式在作者编码过程中,属于比
本文实例讲述了PHP设计模式之建造者模式(Builder)原理与用法。分享给大家供大家参考,具体如下:这个建造者模式,我们也可以称为生成器模式,核心思想是将一个
本文实例讲述了Android编程设计模式之工厂方法模式。分享给大家供大家参考,具体如下:一、介绍工厂方法模式(FactoryPattern),是创建型设计模式之
单例模式Singleton简单实例设计模式解析前言今天我来全面总结一下Android开发中最常用的设计模式-单例模式。关于设计模式的介绍,可以看下我之前写的:1