生成器模式(分离部件构造)

前言

生成器模式的主要功能是构建复杂的产品,而且是细化的,分步骤的构建产品,也就是生成器模式重在解决一步一步构造复杂对象的问题。如果光是这么认识生成器模式的功能是不够的。

更为重要的是,这个构建的过程是统一的,固定不变的,变化的部分放到生成器部分了,只要配置不同的生成器,那么同样的构建过程,就能构建出不同的产品表示来

再直白点说,生成器模式的重心在于分离构建算法具体的构造实现,从而使得构建算法可以重用,具体的构造实现可以很方便的扩展和切换,从而可以灵活的组合来构造出不同的产品对象。

构建生成器模式

一个部分是Builder接口这边,这边是定义了如何构建各个部件,也就是知道每个部件功能如何实现,以及如何装配这些部件到产品中去。

另外一个部分是Director这边,Director是知道如何组合来构建产品,也就是说Director负责整体的构建算法,而且通常是分步骤的来执行。

public class Person {

    private String color;
    private String height;
    private String weight;
    private String gender;

    private Person() {
    }

    @Override
    public String toString() {
        return "Person{" +
                "gender='" + gender + '\'' +
                ", weight='" + weight + '\'' +
                ", height='" + height + '\'' +
                ", color='" + color + '\'' +
                '}';
    }

    public static class Builder {

        private String color;
        private String height;
        private String weight;
        private String gender;

        public Builder buildColor(String color) {
            this.color = color;
            return this;
        }

        public Builder buildWeight(String weight) {
            this.weight = weight;
            return this;
        }

        public Builder buildHeight(String height) {
            this.height = height;
            return this;
        }

        public Builder buildGender(String gender) {
            this.gender = gender;
            return this;
        }

        public Person build() {
            Person person = new Person();
            person.color = color;
            person.gender = gender;
            person.height = height;
            person.weight = weight;
            return person;
        }
    }
}

模式应用

// Android AlertDialog

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)));
        }

        public Builder setCustomTitle(View customTitleView) {
            P.mCustomTitleView = customTitleView;
            return this;
        }

        // 省略其他build方法

        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;
        }

        public AlertDialog show() {
            final AlertDialog dialog = create();
            dialog.show();
            return dialog;
        }
}

AlertController.AlertParamsAlertController所需要的参数。

AlertController.AlertParams.png

AlertController.AlertParams通过调用apply()方法,完成控制器到视图的调用。

AlertController.AlertParams#apply()

apply()的方法的间接调用方是Builder对象中的create()方法。同时create()show()方法也充当着Dirtector角色

导演角色的方法们.png

总结

本例中生成器模式将生成对话框的诸多不确定性职责拆解,向外暴露这些职责并允许可以按照自己的需求填入职责。

生成器模式提供统一的生成过程:
new Builder().build(xxx).create().show();
因而不同的部件传入就会引起不同的视图表现。

设计模式的表达形式有很多种,但是思想都是一致的。

推荐阅读更多精彩内容