设计模式之构建者Builder模式

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_435559203/article/details/54863740

在前一段时间因为业务需求,标题栏的样式变得越来越多的元素增加,导致在TitleBarView(标题栏)的构造方法变得十分的累赘,于是我开始着手优化TitleBarView。

场景分析

    public void initBannerView(String title) {
        initBannerView(title, mBack, null);
    }

    public void initBannerView(String title, View.OnClickListener l, View.OnClickListener r) {
        initBannerView(title, l, r, 0);
    }

    public void initBannerView(String title, View.OnClickListener l, View.OnClickListener r, int rightIcon) {
        ···
    }

这是原本的TitleView的方法,但是新的需求下,需要新增构造方法,TitleBarView将会越来越复杂。首先我们看一下这种采用重叠构造器的不足,参数不多的情况下,是比较方便快捷的,一旦参数多了,代码可读性大大降低,并且难以维护,对调用者来说也造成一定困惑;在《Effective Java》中提及到,当遇到多个构造器参数时,我们要考虑选择用构建器。

Builder模式

Builder模式是不直接生成想要的对象,而是让客户端利用所有必要的参数调用构造器,得到一个builder对象,然后客户端在builder对象上调用类似setter方法,来设置每一个相关的可选参数,最后客户端再调用无参的builder方法来生成所需的对象。下面就是他的示例:

public class TitleBarView {
    private String title;
    private OnClickListener leftListener;
    private OnClickListener rightListener;
    private int rightIcon;

    public static final class Builder {
        private String title = "默认值标题";
        private OnClickListener leftListener = null;
        private OnClickListener rightListener = null;
        private int rightIcon = -1;

        public Builder(String title, OnClickListener leftListener) {
            this.title = title;
            this.leftListener = leftListener;
        }

        public Builder rightClickListener(OnClickListener rightListener) {
            this.rightListener = rightListener;
            return this;

        }

        public Builder rightIcon(int rightIcon) {
            this.rightIcon = rightIcon;
            return this;

        }

        public TitleBarView builder() {
            // TODO Auto-generated constructor stub
            return new TitleBarView(this);
        }
    }

    private TitleBarView(Builder builder) {
        this.title = builder.title;
        this.leftListener = builder.leftListener;
        this.rightListener = builder.rightListener;
        this.rightIcon = builder.rightIcon;
    }
}

调用方式

new TitleBarView.Builder("Builder模式", null).rightIcon(R.drawable.ic_launcher).builder();

这样客户端可以根据需要来对用到的值进行设置。同时在需求变更的时候,可以在TitleBarView类下进行修改,Builder模式采用链式调用,可读性和扩展性都很好。

Builder模式例子

  • Android中的AlertDialog.Builder
        AlertDialog.Builder builder = new AlertDialog.Builder(activity);
        builder.setTitle("Title");
        builder.setMessage("message");
        builder.setNegativeButton("No", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {

            }
        });
        builder.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {

            }
        });
        builder.setCancelable(false);
        builder.show();
  • Retrofit2中Retrofit对象的创建
            Retrofit retrofit = new Retrofit.Builder()
                    .baseUrl(BASE_URL)
                    .client(okHttpClient)
                    .addConverterFactory(GsonConverterFactory.create())
                    .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                    .build();

从官方的AlertDialog,到现在热门的第三方开源库都采用了Builder模式来构建其对应的使用对象,可想而知Builder的确是一个不错的选择。在《Effective Java》中的总结是如果类的构造器或者静态工厂中具有多个参数,设计这种类时,Builder模式就是中不错的选择,特别是当大多数参数都是可选的时候,与使用传统的重叠构造器模式想比,使用Builder模式的客户端代码更易于阅读和编写,构建器也比JavaBeans更加安全。

下面我来介绍一下Android Studio的插件InnerBuilder:

下载插件:
这里写图片描述
重启Android Studio

写好要准备构建的类的变量:

    private String title;
    private View.OnClickListener leftListener;
    private View.OnClickListener rightListener;
    private int rightIcon;

按ALT+SHIFT+S在Generate找到Builder:
这里写图片描述

选中要使用 Builder 构建的对象,然后勾选使用的配置,点击OK:
这里写图片描述
代码一键生成,我就不重复贴代码了,大家可以尝试一下。

猜你喜欢

转载自blog.csdn.net/qq_435559203/article/details/54863740