Java使用Fluent Builder Pattern

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值