构建者(Builder)设计模式(又叫生成器设计模式):
当一个类的内部数据过于复杂的时候(通常是负责持有数据的类,比如Config、VO、PO、Entity...),要创建的话可能就需要了解这个类的内部结构,还有这些东西是怎么组织装配等一大坨乱七八糟的东西,这个时候就会增加学习成本而且会很混乱,这个时候就想啊想一种什么法子来管理一下这个类中的数据呢,怎么在创建的时候让它按部就班的来,并且代码可读性很好别让我看花了眼啊,我要的东西也能都很好设置进来,这就是Builder模式的应用场景,Builder模式可以将一个类的构建和表示进行分离。
public class Student { private int id; private String name; private String passwd; private String sex; private String address; // 构造器尽量缩小范围 private Student() { } // 构造器尽量缩小范围 private Student(Student origin) { // 拷贝一份 this.id = origin.id; this.name = origin.name; this.passwd = origin.passwd; this.sex = origin.sex; this.address = origin.address; } public int getId() { return id; } public String getName() { return name; } public String getPasswd() { return passwd; } public String getSex() { return sex; } public String getAddress() { return address; } /** * Student的创建完全依靠Student.Builder,使用一种方法链的方式来创建 * */ public static class Builder { private Student target; public Builder() { target = new Student(); } public Builder address(int id) { target.id = id; return this; } public Builder name(String name) { target.name = name; return this; } public Builder password(String passwd) { target.passwd = passwd; return this; } public Builder sex(String sex) { target.sex = sex; return this; } public Builder address(String address) { target.address = address; return this; } public Student build() { return new Student(target); } } }
Student并不是直接new出来的,对其构造器进行了处理使其可访问范围尽可能的小,只让它通过Student.Builder来构建自己,在Student.Builder中提供了一种类set的方法链的方式
来设置值,然后在最后的build()方法的时候会返回一个Student对象,现在要创建一个Student对象,
Student s=new Student.Builder().name("CC").password("qwerty").sex("男").address("银河系第二旋臂").build();
再对比一下如果不使用构造者模式(一般情况下的用法):
public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPasswd() { return passwd; } public void setPasswd(String passwd) { this.passwd = passwd; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } }
Student s=new Student("CC","qwerty","男","银河系第二旋臂");
对比一下进行一个优劣性分析:
一般的套路:优点是比较简单,开发效率高,缺点是如果参数真的很多的话鬼知道每个对应的是什么意思啊。
Builder模式:优点是可以将构造器的setter方法名取成类似注释的方式,这样我们可以很清晰的知道刚才究竟设置的什么值,可读性较高,缺点是比较冗长。
总结:初步的理解Builder模式解决了要设置的参数过多不好管理的问题