设计模式之建造者模式

举报
炒香菇的书呆子 发表于 2022/05/12 23:47:58 2022/05/12
【摘要】 使用场景对象的构建有很多必填参数,如果使用构造函数会导致参数列表过长难以使用构造参数之间有依赖关系,比如设置了minAge就必须设置maxAge,且minAge小于等于maxAge类的属性一旦被创建就不可变(不暴力set()方法) 类图Person类包含了一个内部类Builder,负责对外暴露设置属性的方法,这些方法可以包含校验和初始化规则,属性之前的依赖规则可以放到最终调用的build(...

使用场景

  • 对象的构建有很多必填参数,如果使用构造函数会导致参数列表过长难以使用
  • 构造参数之间有依赖关系,比如设置了minAge就必须设置maxAge,且minAge小于等于maxAge
  • 类的属性一旦被创建就不可变(不暴力set()方法)

类图

Person类包含了一个内部类Builder,负责对外暴露设置属性的方法,这些方法可以包含校验和初始化规则,属性之前的依赖规则可以放到最终调用的build()方法中校验

代码实现

public class Person {

    private Long id;
    private String name;
    private Integer minAge;
    private Integer maxAge;

    private Person() {
    }

    public static class Builder {

        private Person person = new Person();

        public Builder id(Long id) {
            person.id = id;
            return this;
        }

        public Builder name(String name) {
            person.name = name;
            return this;
        }

        public Builder minAge(Integer minAge) {
            person.minAge = minAge;
            return this;
        }

        public Builder maxAge(Integer maxAge) {
            person.maxAge = maxAge;
            return this;
        }

        public Person build() {
            if (person.minAge != null && person.maxAge != null) {
                if (person.minAge < 0) {
                    throw new IllegalArgumentException("minAge必须大于等于0");
                }
                if (person.maxAge <= person.minAge) {
                    throw new IllegalArgumentException("maxAge必须大于等于minAge");
                }
            } else if ((person.minAge == null && person.maxAge != null) ||
                    (person.minAge != null && person.maxAge == null)) {
                throw new IllegalArgumentException("minAge和maxAge必须同时设置");
            }
            return person;
        }

    }

}

与工厂模式有何区别?

  • 工厂模式是用来创建不同但是相关类型的对象(继承同一父类或者接口的一组子类),由给定的参数来决定创建哪种类型的对象。
  • 建造者模式是用来创建一种类型的复杂对象,通过设置不同的可选参数,“定制化”地创建不同的对象。
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。