构建器模式:
- 分离复杂对象的构建和表示
- 同样的构建过程可以创建不同的表示
- 无需记忆,自然使用
- 同模板方法模式非常相似,只是模板方法是强调方法执
场景:假如有一个类非常复杂,它有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(); } }