Builder模式的定义是用于构建复杂对象的一种模式,所构建的对象往往需要多步初始化或赋值才能完成。那么,在实际的开发过程中,我们哪些地方适合用到Builder模式呢?其中使用Builder模式来替代多参数构造函数是一个比较好的实践法则。
- build设计模式有两种写法(该模式一般用于参数设置比较多的时候,且有一些参数可以有默认值即不是必须设置的项)
我们有时候会写这样的实现类
Student();
Student(String name);
Student(String name,int age);
Student(String name,int age,String address);
Student(String name,int age,String address,String ID);
为了满足不同的需求有时候必须要这样,把所有的构造函数都声明。这样书写很常见并且也比较有效率但是也存在很多不足,比如类的作者必须好把所有的构造函数都写上,而且在实例化的时候也要写默认值。比如new Student(“张三”,-1,”北京”);年龄为-1肯定不符合常理,但是在实例化一个对象的时候必须要这种默认值,这是规范的要求否则直接报错了。如果没有使用setAge(int age)方法修改age的值,对于代码的后期维护和协同开发同伴使用肯定会是一件很痛苦的事情,因为根本不知道-1的含义是什么。这时候使用Builder模式就很有必要了。Builder模式就是使用一个代理完成对象的构建过程。这样的好处是易于扩展和类的使用,但同时失去了一些效率。
public class Student{
private String name;
private int age;
private String address;
private String ID;
private Student(Builder build){
this.name=build.name;
this.age=build.age;
this.address=build.address;
this.ID=build.ID;
}
public String getName(){
return this.name;
}
public String getAge(){
return this.age;
}
public String getAddress(){
return this.address;
}
public String getID(){
return this.ID;
}
public void method(){
System.out.println(name);
}
static class Builder{
private String name=null;
private int age=0;
private String address=null;
private String ID=null;
public Builder(){};
public Builder(String name){this.name=name}; //可以不写
public Builder setName(String name){this.name=name;return this;}
public Builder setAge(int age){this.age=age;return this;}
public Builder setAddress(String address){this.address=address;return this;}
public Builder setID(String ID){this.ID=ID;return this;}
public Student build(){return new Student(this)}
}
}
最后客户程序可以很灵活比如
Student student=new Student.Builder()
.setName("zhangsan")
.setAge(12)
.setAddress("beijing")
.build();`
这样就可以调用 student.getName()和getAge()等方法了。这样写会丧失一定的效率但是代码易于扩展和使用。如果对student类进行了修改加入了新的成员变量,那么只需简单修改几行代码。如果不这样写构造函数可能要添加很多喽!因为构造函数参数个数和组合有很多种。。
==============================分割线====================================
实际的开发中Build设计模式可能有两种:
- 将外部类作为builder类的成员变量 如:
class C {
public String arg;
...........
static class B {
public C c;
public B (参数) {
c = new C(参数)
}
public B setArg(参数 arg) {
c.arg = arg;
return this;
}
public C build () { return c; }
}
}
- 将Builder类作为外部类的成员变量 如:
class C {
public String arg;
public Builder b;
public C (Builder b){
this.arg = b.arg;
}
static class B {
public String arg;
public B () {}
public B setArg (参数 arg) {
this.arg = arg;
return this;
}
public C build () {return new C (this);}
}
}