Java 之 Builder模式使用

来源:互联网 发布:网络诈骗1000元额受理 编辑:程序博客网 时间:2024/05/17 05:57
有些使用了builder设计模式。自己也不明白在什么场景下才应该使用。 

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

举个例子说明下: 
 


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

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

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

Student表的结构如下: 
 

下面这是利用builder模式设计的Java类: 
Java代码  收藏代码
  1. public class Student {  
  2.     private String id;  
  3.     private String name;  
  4.     private String sex;  
  5.     private int age;  
  6.     private String department;  
  7.   
  8.     public static class Builder {  
  9.         /* 
  10.          * 只能指定一次。 
  11.          */  
  12.         private final String id;  
  13.         private final String department;  
  14.   
  15.         private String name = "";  
  16.         private String sex = "男";  
  17.         private int age = 20;  
  18.   
  19.         /* 
  20.          * 非空属性,必须在构造器中指定。 
  21.          */  
  22.         public Builder(String id, String department) {  
  23.             this.id = id;  
  24.             this.department = department;  
  25.         }  
  26.   
  27.         /* 
  28.          * name,sex,age可选择属性,提供特殊的setter方法。 
  29.          */  
  30.         public Builder name(String name) {  
  31.             this.name = name;  
  32.             return this;  
  33.         }  
  34.   
  35.         public Builder sex(String sex) {  
  36.             this.sex = sex;  
  37.             return this;  
  38.         }  
  39.   
  40.         public Builder age(int age) {  
  41.             this.age = age;  
  42.             return this;  
  43.         }  
  44.   
  45.         /* 
  46.          * Student对象创建器,想得到一个Student对象必须使用build 方法, 
  47.          * 在方法中增加对Builder参数的验证,并以异常的形式告诉给开发人员。 
  48.          */  
  49.         public Student build() {  
  50.             /* 检查Builder对象中的数据是否合法。 
  51.              * 针对这个例子,就是检查主键冲突,外键制约等 
  52.              * 如果不满足我们可以抛出一个IllegalArgumentException 
  53.              */  
  54.             return new Student(this);  
  55.               
  56.         }  
  57.           
  58.     }  
  59.   
  60.     private Student(Builder builder) {  
  61.         this.id = builder.id;  
  62.         this.name = builder.name;  
  63.         this.sex = builder.sex;  
  64.         this.age = builder.age;  
  65.         this.department = builder.department;  
  66.     }  
  67.   
  68.     /* 
  69.      * 只提供getter方法 
  70.      */  
  71.     public String getId() {  
  72.         return id;  
  73.     }  
  74.   
  75.     public String getName() {  
  76.         return name;  
  77.     }  
  78.   
  79.     public String getSex() {  
  80.         return sex;  
  81.     }  
  82.   
  83.     public int getAge() {  
  84.         return age;  
  85.     }  
  86.   
  87.     public String getDepartment() {  
  88.         return department;  
  89.     }  
  90.   
  91. }  


使用Builder模式前后Student对象创建的变化。 
 

    现在创建一个Student对象,只能像这样了: 
Java代码  收藏代码
  1. Student.Builder builder = new Student.Builder("03041013""计算机");  
  2. builder.name("李华");  
  3. Student student = builder.build();  

或者 
Java代码  收藏代码
  1. student = new Student.Builder("03041013""计算机").name("李华").build();  


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

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


感谢:http://qaohao.iteye.com/blog/455539

原创粉丝点击