设计模式之构建者Builder模式
来源:互联网 发布:pdf网络虚拟打印机 编辑:程序博客网 时间:2024/04/19 02:48
在前一段时间因为业务需求,标题栏的样式变得越来越多的元素增加,导致在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:
代码一键生成,我就不重复贴代码了,大家可以尝试一下。
- 设计模式之构建者Builder模式
- 设计模式之Builder构建者模式
- 设计模式之构建Builder
- 设计模式学习之构建者模式(Builder)
- 思维盛宴之设计模式-构建者模式Builder Pattern
- Builder设计模式之构建万能Dialog
- 设计模式——__构建者模式 Builder模式
- 构建者模式(Builder)
- 【设计模式】之 Builder 建造者模式
- 设计模式之建造者(builder)模式
- 设计模式之建造者模式(Builder)
- 设计模式之建造者模式---Builder
- 设计模式之建造者模式(Builder)
- 设计模式之建造者模式(Builder)
- 设计模式之建造者(builder)模式
- 设计模式之Builder建造者模式
- 设计模式之建造者模式(Builder)以及构建器
- 设计模式——构建者模式(Builder)
- Elasticsearch内存设置
- 自定义垂直文字view
- python 调试 函数运行时间line_profiler
- UITextField相关
- C#给图片加水印文字或图片
- 设计模式之构建者Builder模式
- elasticsearch 这些配置
- 深入浅出Mybatis系列(九)---强大的动态SQL
- 在js中怎样获得checkbox里选中的多个值?
- 安卓开发网络bug——responseCode返回值代表的错误,总算找全了
- iOS中对图片拉伸的四种方式
- android与HTML混合开发总结
- (昨天的)codevs 天梯 统计单词个数 dp
- 使用CSDN-markdown模板