Introduction to the Fluent Builder Pattern
fluent builder pattern是比较实用的一种模式,我们可以通过启动构造器,调用相应的setter并最终调用build方法来构建一个复杂的对象,执行完build将得到一个model、entity或者是pojo对象。
Email email = Email.EmailBuilder()
.setFrom("Test@gmail.com")
.setTo("mail@gmail.com")
.setSubject("Test with only required Fields")
.setContent(" Required Field Test").build();
但是当我们在构造一个超级复杂的Object的时候。比如某企业级Order订单类这个非常核心而且非常重要,不允许出错的实体类。可能会在编写的过程中漏掉某个setter,从而缺失了某个属性值。
所以我们需要使用这种Fluent Builder模式来避免这类问题:
以邮件实体类为例
public final class Email {
// To Address. Multiple Address separated by ","
String to;
//From Address
String from;
// Subject of the email
String subject;
// Content of the email
String content;
// BCC optional
String bcc;
// CC Optional
String cc;
}
我们需要定义一下重要(必需)和可选属性,强制必须填写的是from to subject和content,抄送 cc就是可选的。然后需要为设置属性创建一条接口链,如:
// Interface to Set From
interface EmailFrom {
EmailTo setFrom(String from);
}
//Interface to Set To
interface EmailTo {
EmailSubject setTo(String to);
}
//Interface to Set subject
interface EmailSubject {
EmailContent setSubject(String subject);
}
// Interface to set Content
interface EmailContent {
EmailCreator setContent(String content);
}
// Final Email Creator Class
interface EmailCreator {
EmailCreator setBCC(String bcc);
EmailCreator setCC(String cc);
Email build();
}
这里有个细节需要看到,每个属性值的设置都有一个接口和一个方法,但是每个方法返回类型却是接口链的下一个接口。创建一个builder 需要实现所有定义的接口链,如:
public static class EmailBuilder implements EmailFrom, EmailTo,
EmailSubject, EmailContent, EmailCreator{
String to;
String from;
String subject;
String content;
String bcc;
String cc;
/**
* Private emailbuilder to prevent direct object creation
*/
private EmailBuilder(){
}
/**
* Getting the instance method
* @return
*/
public static EmailFrom getInstance(){
return new EmailBuilder();
}
...
}
而我们在使用这个构造器的时候需要把构造器设置为私有的,以便开发人员被迫根据要求创建构造器对象并设置强制性的属性。对于所有可选属性,只需要在链的最后一个接口创建方法和build方法。
如图是创建强制性和非强制属性的email对象
//Creating basic email object without cc and bcc
Email email = Email.EmailBuilder.getInstance().setFrom("Test@gmail.com").setTo("mail@gmail.com")
.setSubject("Test with only required Fields").setContent(" Required Field Test").build();
System.out.println(email);
//Creating the full Email Object with cc and bcc
email = Email.EmailBuilder.getInstance().setFrom("Test@gmail.com").setTo("mail@gmail.com")
.setSubject("Test with ALL Fields").setContent(" ALL Field Test").setBCC("bcc@gmail.com")
.setCC("cc@gmail.com").build();
System.out.println(email);
原文来自于DZone > Java Zone > Introduction to the Fluent Builder Pattern