第二条 多构造参数用 Builder模式

原创 2016年05月30日 17:32:48

一个类中如果属性太多,则写构造方法时很容易产生臃肿的现象。

一般写法有两种,一种是采用重叠构造区模式,先写第一个只有必要参数的构造器,第二个构造器有一个可选参数,第三个构造器有两个可选参数,以此类推;

如果参数比较多时,类里面会出现一堆构造方法,并且阅读困难,很容易就把两个属性参数写颠倒位置了,编译不会出错,但运行就会出错了


第二种是采用 javabean的写法,不重写构造方法,采用默认的构造方法,写一堆属性的setter方法,通过生成对象,让后调用setter方法给属性赋值。  这种方法有个劣势就是构造的过程被分到几个调用中,在构造中可能处于不一致状态,无法保证一致性。


还有一种替代方法,就是builder模式

在实体类Nutrition 里面重新写一个内部静态类Builer,使Builer类的属性和 类 Nutrition 的属性保持一致,例如

public class Nutrition {


private int age;
private int height;
private String name;


public static class Builer{
private int age;
private int height;
private String name;
public Builer setAge(int age) {
this.age = age;
return this;
}
public Builer setHeight(int height) {
this.height = height;
return this;
}
public Builer setName(String name) {
this.name = name;
return this;
}

public Nutrition builder(){
return new Nutrition(this);
}
}


private Nutrition(Builer builder) {
age = builder.age;
height = builder.height;
name = builder.name;
}

}

创建时   Nutrition nur = new Nutrition.Builer().setAge(12).setHeight(175).setName("Tom").builder();  即可。

这种好处是编译时即可检查参数的正确性,Builer模式可以选择参数,可多可少,十分灵活,并且赋值后,调用builder()方法创建对象。

做Android开发的小伙伴,做图片下载的时候,会用到几个工具类,例如Imageloadre,这里面就用到了builer模式

比如 需要在application中初始化 Imageloader对象的基本配置,

ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(context)
.threadPriority(Thread.NORM_PRIORITY - 2)
.denyCacheImageMultipleSizesInMemory()
.diskCacheFileNameGenerator(new Md5FileNameGenerator())
.diskCacheSize(50 * 1024 * 1024) // 50 Mb
.tasksProcessingOrder(QueueProcessingType.LIFO)
.writeDebugLogs() // Remove for release app
.build();
// Initialize ImageLoader with configuration.
ImageLoader.getInstance().init(config);

有兴趣的可以看看  ImageLoaderConfiguration 类的源码,就用到该模式。


如果项目里面大量用到该模式,可以把一个公共的

public Nutrition builder(){
return new Nutrition(this);
}

抽取出来,写成接口,

public interface Builder<T> {
public T builder();
}

需要用到的类都实现该接口,方便管理,例如

public class Nutrition2 {


private int age;
private int height;
private String name;


public static class Builer implements Builder<Nutrition2>{
private int age;
private int height;
private String name;
public Builer setAge(int age) {
this.age = age;
return this;
}
public Builer setHeight(int height) {
this.height = height;
return this;
}
public Builer setName(String name) {
this.name = name;
return this;
}
@Override
public Nutrition2 builder() {
return new Nutrition2(this);
}


}

private Nutrition2(Builer builder) {
age = builder.age;
height = builder.height;
name = builder.name;
}

}

builder类实现接口,泛型里面加入外部类的名字,就完成了。



说到图片下载,比较早的一个工具类 xUtils里面有另外一种写法,写一个简单的例子,仅供参考

public class Nutrition {

private int age;
private int height;
private String name;
public Nutrition setAge(int age) {
this.age = age;
return this;
}
public Nutrition setHeight(int height) {
this.height = height;
return this;
}
public Nutrition setName(String name) {
this.name = name;
return this;
}

}

创建对象时,Nutrition nur = new Nutrition().setAge(12).setHeight(175).setName("Tom");

这个原理和javabean原理一样,相当于是javabena的精炼版,是先产生空白对象,然后赋值,也有javabean的缺陷。

如果类的属性超过四个,建议采用Builder模式

构建者模式(Builder)

WHAT 复杂应用: 当一个应用相关的类和对象参数逐步复杂化,数量逐步增加时,这个应用也会伴随着变得复杂。那么对于复杂对象的使用,为了尽可能降低后期维护成本,我们就不能按照传统的简易方式使用。 ...
  • linyukun6422
  • linyukun6422
  • 2015年01月04日 17:16
  • 491

new AlertDialog.Builder(this).setxx引发的胡思乱想

安卓 设计模式Builder AlertDialog源码 一前言 二建造者模式 三为何dialog使用builder模式 四一般用Builder创建对象的一般方法 五AlertDialog中的Buil...
  • xinjianwuhen1991
  • xinjianwuhen1991
  • 2015年10月27日 22:33
  • 768

StringBuilder对象作为方法的参数

源代码1: public class Experiment11 { public static void main(String[] args) { String s="java"; ...
  • hcy2319964421
  • hcy2319964421
  • 2016年10月12日 12:35
  • 958

Builder(建造器)模式使用

我们开发中在对数据库插入操作这一块,使用了JavaBean去映射数据库中表,JavaBean中的一个属性对应数据库中的一个字段,插入数据就是将JavaBean中属性的值。      在后面的测试中,...
  • asdfsadfasdfsa
  • asdfsadfasdfsa
  • 2018年01月08日 15:37
  • 34

Builder构造者设计模式

原文出处:http://blog.csdn.net/yanbober/article/details/45338041概述建造者模式将客户端与包含多个组成部分的复杂对象的创建过程分离,客户端压根不用知...
  • axi295309066
  • axi295309066
  • 2016年09月20日 18:23
  • 592

使用Builder模式构建可扩展的多个参数构造器

最近在读Joshua Bloch的《Effective Java》,这里做下笔记。一般我们在写类的构造器时,如果遇到大量参数,甚至以后可能会扩展更多参数时,要用哪种构造器呢?重叠构造器模式这也是楼主第...
  • qq_27258799
  • qq_27258799
  • 2016年07月05日 17:53
  • 562

builder模式

一。定义   将一个复杂对象的构建与它的表示分离,使同样的构建过程可以创建不同的表示       builder模式是一步一步创建一个复杂对象,允许用户在不知道内部构建细节的情况下,更精细的控制对...
  • Arlen6310
  • Arlen6310
  • 2016年12月22日 16:12
  • 126

设计模式之——Builder模式

转载请注明出处:http://blog.csdn.net/binbinqq86/article/details/79052236Builder模式相信大家经常使用,可能你并不知道这个模式,但是你做An...
  • binbinqq86
  • binbinqq86
  • 2018年01月13日 18:57
  • 40

使用 Builder 模式构造 JavaBean 的好处

我们一般在构造一个javaBean 对象时,无非有三种写法: 1.直接通过构造函数传参的方式设置属性,这种方法如果属性过多的话会让构造函数十分臃肿,而且不能灵活的选择只设置某些参数。 2.采用重...
  • qq_18796911
  • qq_18796911
  • 2016年12月20日 22:08
  • 3395

Android开发中无处不在的设计模式——Builder模式

上一篇文章介绍了单例模式,这一篇继续介绍一个常见的模式——Builder模式。那么什么是Builder模式呢。你通过搜索,会发现大部分晚上的定义都是 将一个复杂对象的构建与它的表示分离,使得同样的...
  • sbsujjbcy
  • sbsujjbcy
  • 2015年10月18日 10:16
  • 5008
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:第二条 多构造参数用 Builder模式
举报原因:
原因补充:

(最多只允许输入30个字)