许可优化
许可优化
产品
产品
解决方案
解决方案
服务支持
服务支持
关于
关于
软件库
当前位置:服务支持 >  软件文章 >  Builder模式与Fluent Interface设计对比

Builder模式与Fluent Interface设计对比

阅读数 2
点赞 0
article_banner

Builder模式

建造者模式(Builder Pattern)也叫做 生成器  模式。

Separate the construction of a complex object from its representation so that the same construction precess can create different representaions.(将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。)

详见:
https://lovezxm.blog.csdn.net/article/details/118276586

Fluent Interface

连贯接口fluent interfaces)不仅仅能提供 类型 method chainingBuilder模式的方法级联调用,更重要的是能限定方法调用的顺序。

连贯接口不仅仅在提供API,其连贯性带来的可读性和可理解性,也是一种领域语言,是一种Internal DSL。 DSL的核心价值——更加清晰地表达系统中,某一部分的设计意图和业务语义。

本文将介绍,如何通过连贯接口来使用和实现Builder模式。

当我们在构造一个超级复杂的Object的时候。比如某企业级Order订单类这个非常核心而且非常重要,不允许出错的 实体类  。可能会在编写的过程中漏掉某个setter,从而缺失了某个属性值。

   所以我们需要使用这种Fluent Builder模式来避免这类问题:

   以邮件实体类为例,我们需要定义一下重要(必需)和可选属性,强制必须填写的是from、to、subject和content,抄送bcc和 cc 是可选的。

我们需要根据流畅接口的下一个行为(fluent action)去选择返回类型。这种风格的一个很好的优点是方法补完后(intellisense)有助于告诉你接下来要键入什么 —— 有点像 IDE 中的 智能提示

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;

    /**
     * Private constructor to prevent the object initialization
     */
    private Email(String to, String from, String subject, String content, String bcc, String cc) {
        this.to = to;
        this.from = from;
        this.subject = subject;
        this.content = content;
        this.bcc = bcc;
        this.cc = cc;
    }

    public String getTo() {
        return to;
    }
    public String getFrom() {
        return from;
    }
    public String getSubject() {
        return subject;
    }
    public String getContent() {
        return content;
    }
    public String getBcc() {
        return bcc;
    }
    public String getCc() {
        return cc;
    }

    @Override
    public String toString() {
        return "Email{" +
            "to='" + to + '\'' +
            ", from='" + from + '\'' +
            ", subject='" + subject + '\'' +
            ", content='" + content + '\'' +
            ", bcc='" + bcc + '\'' +
            ", cc='" + 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);
    }
    // 对于所有可选属性,只需要在链的最后一个接口创建方法和build方法
    // Final Email Creator Class
    interface EmailCreator {
        EmailCreator setBCC(String bcc);
        EmailCreator setCC(String cc);
        Email build();
    }

    /**
     * Static class for building the email object
     */
    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();
        }

        @Override
        public EmailTo setFrom(String from) {
            this.from = from;
            return this;
        }
        @Override
        public EmailSubject setTo(String to) {
            this.to = to;
            return this;
        }
        @Override
        public EmailContent setSubject(String subject) {
            this.subject = subject;
            return this;
        }
        @Override
        public EmailCreator setContent(String content) {
            this.content = content;
            return this;
        }
        @Override
        public EmailBuilder setBCC(String bcc) {
            this.bcc = bcc;
            return this;
        }
        @Override
        public EmailBuilder setCC(String cc) {
            this.cc = cc;
            return this;
        }
        @Override
        public Email build() {
            return new Email(to, from, subject, content, bcc, cc);
        }
    }
}

/**
 * Test Class
 */
public class EmailTest {
    public static void main(String args[]){
        //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);
    }
}


免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删


相关文章
技术文档
QR Code
微信扫一扫,欢迎咨询~
customer

online

联系我们
武汉格发信息技术有限公司
湖北省武汉市经开区科技园西路6号103孵化器
电话:155-2731-8020 座机:027-59821821
邮件:tanzw@gofarlic.com
Copyright © 2023 Gofarsoft Co.,Ltd. 保留所有权利
遇到许可问题?该如何解决!?
评估许可证实际采购量? 
不清楚软件许可证使用数据? 
收到软件厂商律师函!?  
想要少购买点许可证,节省费用? 
收到软件厂商侵权通告!?  
有正版license,但许可证不够用,需要新购? 
联系方式 board-phone 155-2731-8020
close1
预留信息,一起解决您的问题
* 姓名:
* 手机:

* 公司名称:

姓名不为空

姓名不为空

姓名不为空
手机不正确

手机不正确

手机不正确
公司不为空

公司不为空

公司不为空