定义:
将一个复杂对象的构建与表示分离。使用相同的构建过程可以创建不同的表示。
类型:创建类型
应用场景
- 一个对象有很复杂的结构(很多属性)
- 想把对象的创建与对象的使用分离
优点
- 封装性好,创建与使用分离
- 扩展性好,构建类之间是相互独立的,一定程度上解耦
缺点
- 类爆炸,对应多个builder类
- 产品内部发生变化,构建者的build也要修改
源码应用的场景
- JDK StringBuilder与StringBuffer采用的就是构建者模式
- GUAVA包中ImmutableSet就是典型的构建者模式应用
public abstract class ImmutableSet<E> extends ImmutableCollection<E> implements Set<E> {
public static class Builder<E> extends ImmutableCollection.Builder<E> {
@Override
@CanIgnoreReturnValue
public Builder<E> add(E element) {
checkNotNull(element);
copyIfNecessary();
impl = impl.add(element);
return this;
}
@Override
public ImmutableSet<E> build() {
forceCopy = true;
impl = impl.review();
return impl.build();
}
}
}
demo
UML
目录结构
两个版本,第一个是通过接口、实现类形式,第二个是内部类实现
v1-Course
package creational.builder.v1;
public class Course {
private String name;
private String QA;
private String desc;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getQA() {
return QA;
}
public void setQA(String QA) {
this.QA = QA;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
@Override
public String toString() {
return "Course{" +
"name='" + name + '\'' +
", QA='" + QA + '\'' +
", desc='" + desc + '\'' +
'}';
}
}
v1-CouseBuilderI
package creational.builder.v1;
public interface CouseBuilderI {
CouseBuilderI builderName(String name);
CouseBuilderI builderQA(String QA);
CouseBuilderI builderDesc(String desc);
Course build();
}
v1-CouseActuralBuilder
package creational.builder.v1;
public class CouseActuralBuilder implements CouseBuilderI {
private Course course;
public CouseActuralBuilder() {
this.course = new Course();
}
@Override
public CouseBuilderI builderName(String name) {
this.course.setName(name);
return this;
}
@Override
public CouseBuilderI builderQA(String QA) {
this.course.setQA(QA);
return this;
}
@Override
public CouseBuilderI builderDesc(String desc) {
this.course.setDesc(desc);
return this;
}
@Override
public Course build(){
return this.course;
}
}
v1-Test
package creational.builder.v1;
public class Test {
public static void main(String[] args) {
CouseBuilderI couseBuilder = new CouseActuralBuilder();
Course course = couseBuilder.builderName("zz").builderDesc("desc").builderQA("QA").build();
System.out.println(course);
}
}
v2-Course
package creational.builder.v2;
public class Course {
private String name;
private String QA;
private String desc;
public static class CourseBuilder{
private Course course;
public CourseBuilder(){
this.course=new Course();
}
public CourseBuilder builderName(String name) {
this.course.setName(name);
return this;
}
public CourseBuilder builderQA(String QA) {
this.course.setQA(QA);
return this;
}
public CourseBuilder builderDesc(String desc) {
this.course.setDesc(desc);
return this;
}
public Course build(){
return this.course;
}
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getQA() {
return QA;
}
public void setQA(String QA) {
this.QA = QA;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
@Override
public String toString() {
return "Course{" +
"name='" + name + '\'' +
", QA='" + QA + '\'' +
", desc='" + desc + '\'' +
'}';
}
}
v2-Test
package creational.builder.v2;
import com.google.common.collect.ImmutableSet;
public class Test {
public static void main(String[] args) {
Course course = new Course.CourseBuilder().builderName("zz").builderDesc("desc").builderQA("QA").build();
System.out.println(course);
new StringBuilder();
ImmutableSet<String> immutableSet = new ImmutableSet.Builder<String>().add("zz").build();
System.out.println(immutableSet);
}
}