java build设计模式


使用场景:

1.构造函数参数非常多的情况,这种情况下,如果构造传入大量参数,程序的可读性会非常差

2.有一些构造函数的参数必须需要传入

创建思路:

1.现在通常做法是,在builder内部有一个内部类,这个负责创建需要的对象,然后将对象通过外部类的构造函数传进去,构造我们需要的builder类

2.这和典型的四人帮builder模式是有点不一样的,但设计模式不就是给个模板,然后让使用者自由发挥吗

代码:

1.builder主类

public class PlayerBuider {


    private String firstName;
    private String secondName;
    private int    age;
    private String team;
    private String address;


    public PlayerBuider(KobeBuilder kobeBuilder) {
        this.firstName = kobeBuilder.firstName;
        this.secondName = kobeBuilder.secondName;
        this.age = kobeBuilder.age;
        this.team = kobeBuilder.team;
        this.address = kobeBuilder.address;
    }


    public static class KobeBuilder {
        private String firstName;
        private String secondName;
        private int    age;
        private String team;
        private String address;


        public KobeBuilder(String firstName, String secondName, int age) {
            this.firstName = firstName;
            this.secondName = secondName;
            this.age = age;
        }


        public KobeBuilder setTeam(String team) {
            this.team = team;
            return this;
        }


        public KobeBuilder setAddress(String address) {
            this.address = address;
            return this;
        }


        public PlayerBuider buildePlayer() {
            if (age < 10) {
                throw new IllegalArgumentException(
                    "you must be kidding me!!,kobe bryant went to nba at ten");
            }
            return new PlayerBuider(this);
        }
    }


    @Override
    public String toString() {
        return "firstName :" + this.getFirstName() + "---" + "secondName :" + this.getSecondName()
               + "---" + "age :" + this.getAge() + "---" + "team :" + this.getTeam() + "---"
               + "address :" + this.getAddress();
    }


    /**
     * Getter method for property <tt>firstName</tt>.
     * 
     * @return property value of firstName
     */
    public String getFirstName() {
        return firstName;
    }


    /**
     * Setter method for property <tt>firstName</tt>.
     * 
     * @param firstName value to be assigned to property firstName
     */
    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }


    /**
     * Getter method for property <tt>secondName</tt>.
     * 
     * @return property value of secondName
     */
    public String getSecondName() {
        return secondName;
    }


    /**
     * Setter method for property <tt>secondName</tt>.
     * 
     * @param secondName value to be assigned to property secondName
     */
    public void setSecondName(String secondName) {
        this.secondName = secondName;
    }


    /**
     * Getter method for property <tt>age</tt>.
     * 
     * @return property value of age
     */
    public int getAge() {
        return age;
    }


    /**
     * Setter method for property <tt>age</tt>.
     * 
     * @param age value to be assigned to property age
     */
    public void setAge(int age) {
        this.age = age;
    }


    /**
     * Getter method for property <tt>team</tt>.
     * 
     * @return property value of team
     */
    public String getTeam() {
        return team;
    }


    /**
     * Setter method for property <tt>team</tt>.
     * 
     * @param team value to be assigned to property team
     */
    public void setTeam(String team) {
        this.team = team;
    }


    /**
     * Getter method for property <tt>address</tt>.
     * 
     * @return property value of address
     */
    public String getAddress() {
        return address;
    }


    /**
     * Setter method for property <tt>address</tt>.
     * 
     * @param address value to be assigned to property address
     */
    public void setAddress(String address) {
        this.address = address;
    }


}

2.client测试类

public class BuilderTest {

    public static void main(String[] args) {
        PlayerBuider.KobeBuilder kobe = new PlayerBuider.KobeBuilder("bryant", "kobe", 37);
        PlayerBuider kobeBryant = kobe.setTeam("lakers").setAddress("la").buildePlayer();
        System.out.println(kobeBryant.toString());
    }

}

总结:

1.可以看到PlayerBuider里面有一个具体的KobeBuilder,它负责构造需要的类

2.构造完毕的KobeBuilder传入PlayerBuider的构造函数,返回我们使用的对象

3.在buildePlayer中可以对构造的对象进行一些校验

4.当PlayerBuider的属性相当多的时候,builder模式就会显现出它的价值,虽然这会增加一些方法实现和代码量,但相比较程序的可读性而言,这点牺牲绝对是可以接受的







  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值