Android 中的建造者模式

概述


建造者模式(Builder Pattern)也叫生成器模式,其定义如下:
separate the construction of a complex object from its representation so that the same construction process can create different representations.将一个复杂对象的构建与它的标示分离,这样的话就可以使同样的构建过程可以创建不同的表示。

我的理解:就是把一个产品(对象)表示(展示)和构建(创建)过程分离开来,这样产品的构建流程相同却可以有不同的产品表示。

应用场景


这里举出Android中常见的例子:

android中的AlertDialog对话框的构建过程就是建造者模式的典型应用。

UML

看一下Builder源码

 public static class Builder {    private final AlertController.AlertParams P;    public Builder(Context context) {        this(context, resolveDialogTheme(context, 0));    }     public Builder(Context context, int themeResId) {        P = new AlertController.AlertParams(new ContextThemeWrapper(                context, resolveDialogTheme(context, themeResId)));    }    //各种set参数方法    setTitle()    ...    ...    ...    /**     * Creates an {@link AlertDialog} with the arguments supplied to this     * builder.     * 

* Calling this method does not display the dialog. If no additional * processing is needed, {@link #show()} may be called instead to both * create and display the dialog. */ public AlertDialog create() { // Context has already been wrapped with the appropriate theme. final AlertDialog dialog = new AlertDialog(P.mContext, 0, false); P.apply(dialog.mAlert); dialog.setCancelable(P.mCancelable); if (P.mCancelable) { dialog.setCanceledOnTouchOutside(true); } dialog.setOnCancelListener(P.mOnCancelListener); dialog.setOnDismissListener(P.mOnDismissListener); if (P.mOnKeyListener != null) { dialog.setOnKeyListener(P.mOnKeyListener); } return dialog; } // 这个show方法是builder对象的,里面封装了create()和show()可以直接调取创建并显示对话框 public AlertDialog show() { final AlertDialog dialog = create(); dialog.show(); return dialog; }}

分析源码可以看到内部类Builder是用来构建这个对话框的:

1、创建builder的时候,会把这个AlertController.AlertParams P;对象P创建new出来

2、在对bilder设置各种参数的时,这些参数都存在了对象P中

3、然后builder参数设置完毕后在调用create方法。

final AlertDialog dialog = new AlertDialog(P.mContext, 0, false);P.apply(dialog.mAlert); // mAlert是外部类中的

这个方法中会首先调用外部类AlertDialog的构造方法,new出一个外部类对象,然后p.apply()方法会将P这个对象作为内部类的属性赋值给AlertController的对象mAlert。这样就完成了一次的构建。

下面是AlertDialog的部分源码

public class AlertDialog extends Dialog implements DialogInterface {    // 这个对象用来承接builder内部所设置的参数    private AlertController mAlert;    //以下几个构造方法决定只能通过内部类builder来构建    protected AlertDialog(Context context) {        this(context, 0);    }        protected AlertDialog(Context context, boolean cancelable,     OnCancelListener cancelListener) {        this(context, 0);        setCancelable(cancelable);        setOnCancelListener(cancelListener);    }    protected AlertDialog(Context context, @StyleRes int themeResId) {        this(context, themeResId, true);    }    AlertDialog(Context context, @StyleRes int themeResId, boolean createContextThemeWrapper) {        super(context, createContextThemeWrapper ? resolveDialogTheme(context, themeResId) : 0,            createContextThemeWrapper);        mWindow.alwaysReadCloseOnTouchAttr();        mAlert = new AlertController(getContext(), this, getWindow());        }}

更多相关文章

  1. 浅谈Java中Collections.sort对List排序的两种方法
  2. 类和 Json对象
  3. Python list sort方法的具体使用
  4. python list.sort()根据多个关键字排序的方法实现
  5. android上一些方法的区别和用法的注意事项
  6. android实现字体闪烁动画的方法
  7. Android中dispatchDraw分析
  8. Android四大基本组件介绍与生命周期
  9. Android(安卓)MediaPlayer 常用方法介绍

随机推荐

  1. BootstrapVue 入门[每日前端夜话0x62]
  2. Python 排序算法[一]:令你茅塞顿开,却又匪
  3. 还在一个个写规则?来了解下爬虫的智能化解
  4. 介绍一些比较方便好用的爬虫工具和服务
  5. StreamSet使用要点
  6. Python 如何爬取实时变化的 WebSocket 数
  7. 正式开始工作了,分享一点想法
  8. 在ADC设备上安装SSL证书时出现错误:“证书
  9. 编程老司机带你玩转 CompletableFuture
  10. 深入理解Shadow DOM v1[每日前端夜话0x63