之前用过听过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;
}
}
使用Builder模式前后Student对象创建的变化。
现在创建一个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类的创建和设置内容揉在了一起,并增加了安全性检查,提高了系统的健壮性,同时防止了编码中的一些疏忽。
- 大小: 12.1 KB
- 大小: 9.2 KB
- 大小: 12.5 KB
- 大小: 11.8 KB
分享到:
相关推荐
在设计模式中对Builder模式的定义是用于构建复杂对象的...其中使用Builder模式来替代多参数构造函数是一个比较好的实践法则。 我们常常会面临编写一个这样的实现类(假设类名叫DoDoContact),这个类拥有多个构造函数,
【Java面试题】builder模式
23种设计模式的java实现-Builder
FreeBuilder为 Java 1.6 自动生成 Builder 模式。当设计类的构造函数或静态工厂具有多个参数时,Builder 模式是一个不错的选择。—— Effective Java,第二版,第39页背景在 Java 中实现 Builder 模式容易出错和...
demo中使用了设计模式中的建造者模式,代码非常精简,本地可正常运行,亲测有效!
java设计模式之Builder&Decorator,java设计模式之Builder&Decorator
Builder模式代码-一个java类 Builder模式代码-一个java类
在设计模式中对Builder模式的定义是用于构建复杂对象的一种模式,所构建的对象往往需要多步...下面这篇文章主要给大家介绍了在Java各个版本中Builder模式实现的相关资料,文中介绍的非常详细,需要的朋友可以参考学习。
Java设计模式:Builder模式应用案例[整理].pdf
Java设计模式:Builder模式应用案例[借鉴].pdf
FreeBuilder 为 Java 1.6 自动生成 Builder 模式。 当设计类的构造函数或静态工厂具有多个参数时,Builder 模式是一个不错的选择。
Builder模式:将一个复杂对象的构建与表示分离,使得同样的构建过程可以创建不同的表示。当创建复杂对象的算法应该独立于改对象的组成部分以及他们的装配方式时。当构建过程必须允许被构造的对象有不同的表示时。
自动为Java 1.8+生成Builder模式 当设计类的构造函数或静态工厂将具有多个参数的类时,Builder模式是一个不错的选择。 —有效的Java,第二版,第39页 背景 在Java中实现非常繁琐,容易出错且重复。 谁没有看过一个...
各个设计模式的介绍,非常不错 Java与设计模式 设计模式之Factory -工厂模式设计模式之FACTORY METHOD -工厂模式設計模式之Builder -建造模式
概述 Builder模式:将一个...下面从一个Person例子进行分析重叠构造器模式、JavaBeans模式、Builder模式的使用。Person类有两个必要参数(id和name),有5个可选参数(age,sex,phone,address和desc) 重叠构造器模式
设计模式之Builder 设计模式之Singleton(单态) 结构模式: 设计模式之Facade(外观) 设计模式之Proxy(代理) 设计模式之Adapter(适配器) 设计模式之Composite(组合) 设计模式之Decorator(油漆工) 设计模式之Bridge 设计...
NULL 博文链接:https://hello-player.iteye.com/blog/630164
Java 设计模式-建造者模式(Builder)结合Android小知识讲解,简单明了
用于学习android java builder模式
我们在构建一个MAP时,要不停的调用put,有时候看着觉得很麻烦,刚好,看了下builder模式,觉得这思路不错,于是乎,照着用builder模式写了一个构建MAP的示例,代码如下: import java.util.HashMap; import java....