JAVA设计模式之构建器模式(builder)
构建器模式:
- 分离复杂对象的构建和表示
- 同样的构建过程可以创建不同的表示
- 无需记忆,自然使用
- 同模板方法模式非常相似,只是模板方法是强调方法执
场景:假如有一个类非常复杂,它有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();
}
在我们实际的业务场景中如何使用的呢,请看代码:
package com.srr.dp.builder; import java.sql.Date; /** * 实际应用场景使用构建器模式 */ public class Person { private int age; private String name; private int sex; private Date birthday; private int weight; public static class PersonBuilder{ Person person = new Person(); public PersonBuilder buildinfo(int age,String name,int sex) { person.age = age; person.name = name; person.sex = sex; return this; } public PersonBuilder buildWeight(int weight) { person.weight = weight; return this; } public PersonBuilder buildBirthday(Date birthday) { person.birthday = birthday; return this; } public Person build() { return person; } } } package com.srr.dp.builder; import java.sql.Date; /** * 测试类 * 如果Person类有100个属性,而且并不是所有的属性都需要赋值,用的时候赋值,不用的时候不传值 * 如果使用java普通的构建方式,100个参数都赋值,读起来费劲,写起来累死 * 鉴于只是说明原理,并没有实际构建100个属性 */ public class T { public static void main(String[] args) { Person person = new Person.PersonBuilder().buildinfo(32,"srr",0) .buildWeight(120) //如果不想构建weight那么不调用buildWeight即可 .buildBirthday(new Date(1L)).build(); } }

浙公网安备 33010602011771号