浅谈Java设计模式----建造者模式

本文介绍在面对需求频繁变更时如何运用建造者模式简化对象创建过程。通过实例展示建造者模式在Person类中的应用,使对象构建更加灵活高效。

在Android中我们经常使用到对话框这个API,其中这里面使用的就是建造者设计模式,当你需要为对话框设置一些内容如标题、对话框内容、确定按取消按钮等,我们可以使用链式调用一系列方法为其设置属性。

AlertDialog dialog=new AlertDialog.Builder(this)
                .setTitle()
                .setMessage()
                .setNegativeButton()
                .setPositiveButton()
                .show();

在使用某种设计模式的时候,我们应该想到在什么情况下需要使用,什么情况不需要使用。在这里举个例子:假如辅导员需要你统计班上同学的信息,第一次的时候只让你统计姓名、年龄、性别一般情况下我们会采用构造函数的方式去实现,如下代码

 Person person=new Person("小明",19,"男");
 System.out.println(person.toString());

Person类

public class Person {

    private int age;
    private String name;
    private String sex;

    public Person(String name, int age, String sex) {
        this.name = name;
        this.age = age;
        this.sex = sex;
    }
    @Override
    public String toString() {
        return "Person{" +
                "age=" + age +
                ", name='" + name + '\'' +
                ", sex='" + sex + '\'' +
                '}';
    }
}    

当你刚暗暗窃喜的时候,这时候辅导员又说在把居住地址和QQ号加上,方便组建班级群。然后你就要去增加一个构造函数,再把这些值传进去。后来辅导员新需求又来了,告诉你还需要添加家长的联系方式,这时候难道又要去修改构造函数?这时候建造着模式就可以闪亮登场了!

public class Person {

    private int age;
    private int QQ;
    private int phone;
    private String name;
    private String sex;
    private String address;
    private String email;

    public static class Builder {
        private Person p;

        public Builder() {
            p = new Person();
        }

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

        public Builder setSex(String sex) {
            p.sex = sex;
            return this;
        }

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

        public Builder setAge(int age) {
            p.age = age;
            return this;
        }

        public Builder setEmail(String email) {
            p.email = email;
            return this;
        }

        public Builder setQQ(int QQ) {
            p.QQ = QQ;
            return this;
        }


        public Builder setPhone(int phone) {
            p.phone = phone;
            return this;
        }

        public Person create() {
            return p;
        }
    }

    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder();
        if (name != null) {
            sb.append("name:" + name + ",");
        }
        if (age != 0) {
            sb.append("age:" + age + ",");
        }
        if (sex != null) {
            sb.append("sex:" + sex + ",");
        }
        if (phone != 0) {
            sb.append("phone:" + phone + ",");
        }
        if (QQ != 0) {
            sb.append("QQ:" + QQ + ",");
        }
        if (email != null) {
            sb.append("email:" + email + ",");
        }
        if (address != null) {
            sb.append("address:" + address);
        }
        return sb.toString();
    }
}

具体的使用

Person p1 = new Person.Builder()
                .setName("小明")
                .setAge(18)
                .setSex("男")
                .create();
        System.out.println(p1.toString());

        Person p2 = new Person.Builder()
                .setName("小明")
                .setAge(18)
                .setSex("男")
                .setQQ(999999)
                .setAddress("深圳市龙岗区坂田")
                .create();
        System.out.println(p2.toString());

        Person p3 = new Person.Builder()
                .setName("小明")
                .setAge(18)
                .setSex("男")
                .setQQ(666888)
                .setPhone(1383838438)
                .setAddress("深圳市龙岗区坂田")
                .create();
        System.out.println(p3.toString());

程序运行效果

这里写图片描述

这样我们的建造设计模式就实现完了,当你再在遇上这种改需求的狂魔就可以轻松的应对了。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Code-Porter

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值