1. Builder模式介紹java
Builder模式是一步一步建立一個複雜對象的建立型模式,它容許用戶在不知道內部構建細節的狀況下,能夠更精細地控制對象的構造流程。該模式是爲了將構建複雜對象的過程和它的部件解耦,使得構建過程和部件的表示隔離開來。android
Builder一般爲鏈式調用,關鍵點是每一個settter方法都返回自身,也就是return this,這樣就使得setter方法能夠鏈式調用。緩存
2. Android源碼中的Builder模式實現網絡
最經常使用的就是AlertDialog.Builder,用來建立AlertDialog對象。工具
private void showAlertDialog(Context mContext) { AlertDialog.Builder builder = new AlertDialog.Builder(mContext); builder.setTitle("title"); builder.setMessage("message"); ........ builder.create().show(); }
3. Builder模式實戰ui
圖片加載工具,須要添加些參數,好比線程數量、網絡下載時的默認圖片placeholder等。this
你們通常想到的就是直接在ImageLoader中增長setter方法url
package com.outman.myimageloader; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.widget.ImageView; import java.io.IOException; import java.net.HttpURLConnection; import java.net.URL; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class ImageLoader { // 封裝的緩存類 private ImageCache mImageCache = new MemoryCache(); // 線程池,線程數量爲CPU的數量 private ExecutorService mExecutorService; private int mPlaceHolder; private static ImageLoader mInstance; private ImageLoader() { mExecutorService = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()); } public static ImageLoader getInstance() { ............. } public void setImageCache(ImageCache cache) { this.mImageCache = cache; } public void setThreadCount(int count) { mExecutorService.shutdown(); mExecutorService = null; mExecutorService = Executors.newFixedThreadPool(count); } public void setPlaceHolder(int resId) { this.mPlaceHolder = resId; } ............... }
上面的代碼存在一個問題就是,設置緩存、線程數等,這些都應該在初始化ImageLoader時設置好,後面不容許再修改,這種能夠使用Builder模式來避免。.net
public class ImageConfig { // 封裝的緩存類 private ImageCache mImageCache = new MemoryCache(); // 線程個數 private int mThreadCount = Runtime.getRuntime().availableProcessors(); // 默認圖片 private int mPlaceHolder; public ImageCache getCache() { return mImageCache; } public int getThreadCount() { return mThreadCount; } public int getPlaceHolder() { return mPlaceHolder; } /** * 配置類的Builder */ public static class Builder { private ImageConfig mConfig; public Builder() { mConfig = new ImageConfig(); } public Builder setImageCache(ImageCache cache) { mConfig.mImageCache = cache; return this; } public Builder setThreadCount(int count) { mConfig.mThreadCount = count; return this; } public Builder setPlaceHolder(int resId) { mConfig.mPlaceHolder = resId; return this; } public ImageConfig create() { return mConfig; } } }
public class ImageLoader { private ImageConfig mConfig; // 線程池,線程數量爲CPU的數量 private ExecutorService mExecutorService; private static ImageLoader mInstance; private ImageLoader() { } public static ImageLoader getInstance() { ............. } public void init(ImageConfig config) { this.mConfig = config; checkConfig(); mExecutorService = Executors.newFixedThreadPool(this.mConfig.getThreadCount()); } /** * 加載圖片 * @param url * @param imageView */ public void displayImage(final String url, final ImageView imageView) { checkConfig(); ............ } ............... private void checkConfig() { } }
我的理解:「Builder模式的好處是,能夠封閉一些沒必要要的暴露,即setXXX方法,在某些場景下只須要初始化時設置一次,後面不容許再修改。使用Builder模式將這些方法封裝,利用鏈式調用,使配置的構建簡單化,避免過多的setXXX方法在目標類中」線程