Java之Builder模式使用
之前用过听过builder设计模式,但自己的代码中从来没有应用过,只知道在做GUI开发时用到的控件,它们当中有些使用了builder设计模式。自己也不明白在什么场景下才应该使用。
先说说我遇到的实际情况吧。
我们开发中在对数据库插入操作这一块,使用了JavaBean去映射数据库中表,JavaBean中的一个属性对应数据库中的一个字段,插入数据就是将JavaBean中属性的值。
举个例子说明下:
插入数据过程如下:
在后面的测试中,发现系统有时会蹦出一个数据库异常,最终调查发现就是因为JavaBean的内容不正确才导致的。
我觉得这个原因主要是因为对JavaBean的创建和向JavaBean中设置内容是分离的,因为数据库中的表在创建时有些约束,像主键约束,非空约束等,而我们在设置完JavaBean中的属性以后,并不能保证由于疏忽或者其它原因导致,JavaBean内容设置的不正确,从而在DAO层,插入数据库是就会失败。
像上面这种错误,在编码阶段就应该避免,正因为上面那种设计才滋生的那种错误。如果我们能将创建JavaBean和设置内容揉在一起,并在当中增加相应的检查,就可以避免这些问题的发生,将Oracle错误转换成Java异常,然后交给try-catch块去处理。
Student表的结构如下:
下面这是利用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;}}
Student.Builder builder = new Student.Builder("03041013", "计算机"); builder.name("李华"); Student student = builder.build();
student = new Student.Builder("03041013", "计算机").name("李华").build();