Java之Builder模式使用

之前用过听过builder设计模式,但自己的代码中从来没有应用过,只知道在做GUI开发时用到的控件,它们当中有些使用了builder设计模式。自己也不明白在什么场景下才应该使用。

先说说我遇到的实际情况吧。

我们开发中在对数据库插入操作这一块,使用了JavaBean去映射数据库中表,JavaBean中的一个属性对应数据库中的一个字段,插入数据就是将JavaBean中属性的值。

举个例子说明下:
[img]/upload/attachment/139156/b7082e3c-18d1-348d-9951-337b39cfe397.jpg[/img]


插入数据过程如下:
[img]/upload/attachment/139136/6cbac4c1-390d-3b0a-b300-93a0ea7fdd55.jpg[/img]

在后面的测试中,发现系统有时会蹦出一个数据库异常,最终调查发现就是因为JavaBean的内容不正确才导致的。

我觉得这个原因主要是因为对JavaBean的创建和向JavaBean中设置内容是分离的,因为数据库中的表在创建时有些约束,像主键约束,非空约束等,而我们在设置完JavaBean中的属性以后,并不能保证由于疏忽或者其它原因导致,JavaBean内容设置的不正确,从而在DAO层,插入数据库是就会失败。

像上面这种错误,在编码阶段就应该避免,正因为上面那种设计才滋生的那种错误。如果我们能将创建JavaBean和设置内容揉在一起,并在当中增加相应的检查,就可以避免这些问题的发生,将Oracle错误转换成Java异常,然后交给try-catch块去处理。

Student表的结构如下:
[img]/upload/attachment/139138/7c298cd4-48b7-33cd-aad1-48c81c87aff0.jpg[/img]

下面这是利用builder模式设计的Java类:

public class Student {
private String id;
private String name;
private String sex;
private int age;
private String department;

public static class Builder {
/*
* 只能指定一次。
*/
private final String id;
private final String department;

private String name = "";
private String sex = "男";
private int age = 20;

/*
* 非空属性,必须在构造器中指定。
*/
public Builder(String id, String department) {
this.id = id;
this.department = department;
}

/*
* name,sex,age可选择属性,提供特殊的setter方法。
*/
public Builder name(String name) {
this.name = name;
return this;
}

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

public Builder age(int age) {
this.age = age;
return this;
}

/*
* Student对象创建器,想得到一个Student对象必须使用build 方法,
* 在方法中增加对Builder参数的验证,并以异常的形式告诉给开发人员。
*/
public Student build() {
/* 检查Builder对象中的数据是否合法。
* 针对这个例子,就是检查主键冲突,外键制约等
* 如果不满足我们可以抛出一个IllegalArgumentException
*/
return new Student(this);

}

}

private Student(Builder builder) {
this.id = builder.id;
this.name = builder.name;
this.sex = builder.sex;
this.age = builder.age;
this.department = builder.department;
}

/*
* 只提供getter方法
*/
public String getId() {
return id;
}

public String getName() {
return name;
}

public String getSex() {
return sex;
}

public int getAge() {
return age;
}

public String getDepartment() {
return department;
}

}


使用Builder模式前后Student对象创建的变化。
[img]/upload/attachment/139140/b847c36e-0531-3582-b113-026f8015eca1.jpg[/img]

现在创建一个Student对象,只能像这样了:

Student.Builder builder = new Student.Builder("03041013", "计算机");
builder.name("李华");
Student student = builder.build();

或者

student = new Student.Builder("03041013", "计算机").name("李华").build();


如果你在传入builder中的参数不合乎业务或者非法,那么就不能创建student对象,这时候你可以通过捕获IllegalArgumentException,从而得知失败的原因。

引入Builder设计模式以后,代码保持JavaBean好的可读性,但同时增强了安全性,将Student类的创建和设置内容揉在了一起,并增加了安全性检查,提高了系统的健壮性,同时防止了编码中的一些疏忽。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值