首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >生成器模式(分离部件构造)

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

作者头像
幺鹿
发布2018-08-21 15:41:03
2910
发布2018-08-21 15:41:03
举报
文章被收录于专栏:Java呓语Java呓语

前言

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

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

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

构建生成器模式

一个部分是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(); 因而不同的部件传入就会引起不同的视图表现。

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017.02.24 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 构建生成器模式
  • 模式应用
    • 总结
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档