构建器模式:
分离复杂对象的构建和表示
同样的构建过程可以创建不同的表示
无需记忆,自然使用
同模板方法模式非常相似,只是模板方法是强调方法执
场景:假如有一个类非常复杂,它有100个属性,如果使用java提供的构造方法构建它需要给它传递100个参数,这么构建岂不是很费劲,而且在实际的业务场景中并不需要对该
对象的所有属性都赋值,那么使用构建器模式我们可以先构建一部分,再构建一部分,最后构建其他的,这样的化就可以根据实际业务场景灵活的控制对象的构建过程。
代码实现:
package com.srr.dp.builder;
/**
* 构建器接口
*/
public interface Builder {
Builder build0();
Builder build1();
Builder build2();
ComplexClass build();
}
package com.srr.dp.builder;
/**
* 复杂对象
*/
public class ComplexClass {
protected class1 c1;
protected class2 c2;
protected class3 c3;
}
class class1 {
private int a;
class1(int a){
this.a = a;
}
}
class class2 {
private String name;
class2(String name){
this.name = name;
}
}
class class3 {
private long b;
class3(long b){
this.b = b;
}
}
package com.srr.dp.builder;
/**
* 简单构建器
*/
public class SimpleBuilder implements Builder {
ComplexClass cc = new ComplexClass();
@Override
public Builder build0() {
class1 c1 = new class1(1);
cc.c1 = c1;
return this;
}
@Override
public Builder build1() {
class2 c2 = new class2("");
cc.c2 = c2;
return this;
}
@Override
public Builder build2() {
class3 c3 = new class3(2L);
cc.c3 = c3;
return this;
}
@Override
public ComplexClass build() {
return cc;
}
}
package com.srr.dp.builder;
/**
* 测试类
*/
public class T2 {
Builder builder = new SimpleBuilder();
ComplexClass cc = builder.build0().build1().build2()
.build();
}
在我们实际的业务场景中如何使用的呢,请看代码:
packagecom.srr.dp.builder;importjava.sql.Date;/*** 实际应用场景使用构建器模式*/
public classPerson {private intage;privateString name;private intsex;privateDate birthday;private intweight;public static classPersonBuilder{
Person person= newPerson();public PersonBuilder buildinfo(int age,String name,intsex) {
person.age=age;
person.name=name;
person.sex=sex;return this;
}public PersonBuilder buildWeight(intweight) {
person.weight=weight;return this;
}publicPersonBuilder buildBirthday(Date birthday) {
person.birthday=birthday;return this;
}publicPerson build() {returnperson;
}
}
}packagecom.srr.dp.builder;importjava.sql.Date;/*** 测试类
* 如果Person类有100个属性,而且并不是所有的属性都需要赋值,用的时候赋值,不用的时候不传值
* 如果使用java普通的构建方式,100个参数都赋值,读起来费劲,写起来累死
* 鉴于只是说明原理,并没有实际构建100个属性*/
public classT {public static voidmain(String[] args) {
Person person= new Person.PersonBuilder().buildinfo(32,"srr",0)
.buildWeight(120) //如果不想构建weight那么不调用buildWeight即可
.buildBirthday(new Date(1L)).build();
}
}