Builder模式解决构造函数多参数阅读性不好问题

来源:互联网 发布:vm虚拟机ubuntu性能 编辑:程序博客网 时间:2024/05/19 02:24

在设计模式中对Builder模式的定义是用于构建复杂对象的一种模式,所构建的对象往往需要多步初始化或赋值才能完成。那么,在实际的开发过程中,我们哪些地方适合用到Builder模式呢?其中使用Builder模式来替代多参数构造函数是一个比较好的实践法则。

我们常常会面临编写一个这样的实现类(假设类名叫DoDoContact),这个类拥有多个构造函数,

DoDoContact(String name);

DoDoContact(String name, int age);

DoDoContact(String name, int age, String address);

DoDoContact(String name, int age, String address, int cardID);

这样一系列的构造函数主要目的就是为了提供更多的客户调用选择,以处理不同的构造请求。这种方法很常见,也很有效力,但是它的缺点也很多。类的作者不得不书写多种参数组合的构造函数,而且其中还需要设置默认参数值,这是一个需要细心而又枯燥的工作。其次,这样的构造函数灵活性也不高,而且在调用时你不得不提供一些没有意义的参数值,例如,DoDoContact("Ace", -1, "SH"),显然年龄为负数没有意义,但是你又不的不这样做,得以符合Java的规范。如果这样的代码发布后,后面的维护者就会很头痛,因为他根本不知道这个-1是什么含义。对于这样的情况,就非常适合使用Builder模式。Builder模式的要点就是通过一个代理来完成对象的构建过程。这个代理职责就是完成构建的各个步骤,同时它也是易扩展的。

public class PersonModel {    private int age;    private int length;    private int siz;    private String name;    private String address;    public int getAge() {        return age;    }    public void setAge(int age) {        this.age = age;    }    public int getLength() {        return length;    }    public void setLength(int length) {        this.length = length;    }    public int getSiz() {        return siz;    }    public void setSiz(int siz) {        this.siz = siz;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public String getAddress() {        return address;    }    public void setAddress(String address) {        this.address = address;    }    public static class PersonBuilder{        private int age;        private int length;        private int siz;        private String name;        private String address;        /**         * 以下是为多个数据赋值,返回同一个对象         * @param value         * @return         */        public PersonBuilder age(int value){            this.age=value;            return this;        }        public PersonBuilder length(int vale){            this.length=vale;            return this;        }        public PersonBuilder siz(int vale){            this.siz = vale;            return this;        }        public PersonBuilder name(String value){            this.name = value;            return this;        }        public PersonBuilder address(String value){            this.address=value;            return this;        }        /**         * 用于生成Builder对象,当然可以加上必要的参数         */        public PersonBuilder (){        }        /**         * 用于生成我们要构建的对象         * @return         */        public PersonModel build(){            return new PersonModel(this);        }    }    /**     * 提供私有的构造方法,通过构造器来给所需要的参数赋值     * @param builder     */    private PersonModel(PersonBuilder builder){        this.name = builder.name;        this.address =builder.address;        this.age=builder.age;        this.siz=builder.siz;        this.length=builder.length;    }}

客户端调用

public class BuilderTest {    public static void main(String[] args) {        PersonModel build = new PersonModel.PersonBuilder().name("zs").age(10).length(20).address("北京").build();        System.out.println(build.getName());    }}


0 0
原创粉丝点击