Introduction to the Fluent Builder Pattern
流利的构建器模式是最有用的模式之一,尤其是当您要构建复杂的对象时。例如,假设您要通过启动构建器,调用相应的setter并最终调用build方法来构建复杂的对象。一旦执行了build方法,您将获得所需的模型/实体/ pojo对象。
1 2 3 4 5 | Email email = Email.EmailBuilder() .setFrom("[email protected]") .setTo("[email protected]") .setSubject("Test with only required Fields") .setContent(" Required Field Test").build(); |
这看起来很简单,但是有一个陷阱。如果对象构建很复杂并且设置方法太多,那么开发人员通常会忘记一些设置器并构建对象。这样做,许多重要的对象属性将为null,因此,不会为相同的对象调用任何setter。
在许多企业应用程序中,将有一个核心实体,如"订单/贷款",它可能会在代码的许多部分中启动,缺少set属性对于开发和维护而言可能是一个代价高昂的过程。所以你会怎么做-
答案是强制开发人员在调用build方法之前设置所有必需的setter方法。这样做,所有必需的属性将被初始化,并且构建对象处于所需状态。但是如何强迫开发商?答案是通过流畅的构建器模式。
什么是Fluent Builder模式?
Fluent构建器模式是一种编码样式,通过依次调用每个setter方法,直到所有必需的属性都被使用,强制开发人员依次创建对象。组。 BLOCKQUOTE>让我们详细介绍如何实现流畅的构建器模式。流利的构建器模式类似于任何流利的API调用,但这用于构建对象。为了实现流畅的构建器,我们将创建 一个接口链,其中每个接口方法将返回下一个接口类型。困惑?让我举例说明。为了简单起见,我们将尝试构建电子邮件对象,该对象将包含发送电子邮件的所有信息。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15让我们定义必需和可选属性。强制属性是从,到,主题和内容。可选属性是cc和bcc。在这里,我们需要为设置属性创建接口链,如下所示:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 // 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();
}如果您为每个属性看到一个接口和一个方法,则该方法的返回类型是序列中的下一个接口。创建构建器类很容易,它需要实现我们定义为接口链一部分的所有接口,如下所示:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 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方法。
让我们创建仅具有强制和非强制属性的电子邮件对象,如下所示:
1
2
3
4
5
6
7
8
9
10
11
12 //Creating basic email object without cc and bcc
Email email = Email.EmailBuilder.getInstance().setFrom("[email protected]").setTo("[email protected]")
.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("[email protected]").setTo("[email protected]")
.setSubject("Test with ALL Fields").setContent(" ALL Field Test").setBCC("[email protected]")
.setCC("[email protected]").build();
System.out.println(email);结论
如果您的要求是构建一个复杂的对象,并为其设置强制属性并避免犯任何错误,那么流畅的构建器将比传统的构建器模式更有用。
您可以在此处找到完整的代码。