Fluent Builder模式简介

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方法,直到所有必需的属性都被使用,强制开发人员依次创建对象。组。

让我们详细介绍如何实现流畅的构建器模式。流利的构建器模式类似于任何流利的API调用,但这用于构建对象。为了实现流畅的构建器,我们将创建 一个接口链,其中每个接口方法将返回下一个接口类型。困惑?让我举例说明。为了简单起见,我们将尝试构建电子邮件对象,该对象将包含发送电子邮件的所有信息。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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;
}

让我们定义必需和可选属性。强制属性是从,到,主题和内容。可选属性是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);

结论

如果您的要求是构建一个复杂的对象,并为其设置强制属性并避免犯任何错误,那么流畅的构建器将比传统的构建器模式更有用。

您可以在此处找到完整的代码。