有些使用了builder设计模式。自己也不明白在什么场景下才应该使用。 



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


  


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



举个例子说明下: 


 




插入数据过程如下: 


 


    


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



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



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



Student表的结构如下: 


 



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

Java代码  

   
  
1. public class
2. private
3. private
4. private
5. private int
6. private
7.   
8. public static class
9. /*
10.          * 只能指定一次。
11.          */
12. private final
13. private final
14.   
15. private String name = "";  
16. private String sex = "男";  
17. private int age = 20;  
18.   
19. /*
20.          * 非空属性,必须在构造器中指定。
21.          */
22. public
23. this.id = id;  
24. this.department = department;  
25.         }  
26.   
27. /*
28.          * name,sex,age可选择属性,提供特殊的setter方法。
29.          */
30. public
31. this.name = name;  
32. return this;  
33.         }  
34.   
35. public
36. this.sex = sex;  
37. return this;  
38.         }  
39.   
40. public Builder age(int
41. this.age = age;  
42. return this;  
43.         }  
44.   
45. /*
46.          * Student对象创建器,想得到一个Student对象必须使用build 方法,
47.          * 在方法中增加对Builder参数的验证,并以异常的形式告诉给开发人员。
48.          */
49. public
50. /* 检查Builder对象中的数据是否合法。
51.              * 针对这个例子,就是检查主键冲突,外键制约等
52.              * 如果不满足我们可以抛出一个IllegalArgumentException
53.              */
54. return new Student(this);  
55.               
56.         }  
57.           
58.     }  
59.   
60. private
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
72. return
73.     }  
74.   
75. public
76. return
77.     }  
78.   
79. public
80. return
81.     }  
82.   
83. public int
84. return
85.     }  
86.   
87. public
88. return
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类的创建和设置内容揉在了一起,并增加了安全性检查,提高了系统的健壮性,同时防止了编码中的一些疏忽。