建造者(Builder)模式包含如下角色:
抽象建造者类(Builder):这个接口规定要实现复杂对象的那些部分的创建,并不涉及具体的部件对象的创建。
具体建造者类(ConcreteBuilder):实现 Builder 接口,完成复杂产品的各个部件的具体创建方法。在构造过程完成后,提供产品的实例。
产品类(Product):要创建的复杂对象。
指挥者类(Director):调用具体建造者来创建复杂对象的各个部分,在指导者中不涉及具体产品的信息,只负责保证对象各部分完整创建或按某种顺序创建。
抽象建造者:制定方法
public interface Builder {
void step1();
void step2();
void step3();
Product getProduct();
}
产品类
public class Product {
private String step1;
private String step2;
private String step3;
public void setStep1(String step1) {
this.step1 = step1;
}
public void setStep2(String step2) {
this.step2 = step2;
}
public void setStep3(String step3) {
this.step3 = step3;
}
@Override
public String toString() {
return "Product{" +
"step1='" + step1 + '\'' +
", step2='" + step2 + '\'' +
", step3='" + step3 + '\'' +
'}';
}
}
具体建造者
public class Worker implements Builder {
private Product product;
public Worker() {
product = new Product();
}
@Override
public void step1() {
product.setStep1("步骤1");
System.out.println("步骤1");
}
@Override
public void step2() {
product.setStep2("步骤2");
System.out.println("步骤2");
}
@Override
public void step3() {
product.setStep3("步骤3");
System.out.println("步骤3");
}
@Override
public Product getProduct() {
return product;
}
}
指挥者:核心,负责指挥构建一个工程,工程如何构建,由它决定
public class Director {
//指挥Worker工作步骤
public Product build(Builder builder){
builder.step1();
builder.step2();
builder.step3();
return builder.getProduct();
}
}
测试方法
public class Test {
public static void main(String[] args) {
//创建指挥
Director director = new Director();
//指挥Worker完成工作
Product build = director.build(new Worker());
System.out.println(build.toString());
}
}
输出结果

这种方式没有指挥类,相当于将指挥类的功能交付给具体的建造者
抽象建造者
public interface Builder {
Builder buildA(String msg);//汉堡
Builder buildB(String msg);//可乐
Builder buildC(String msg);//薯条
Builder buildD(String msg);//炸鸡
Product getProduct();
}
产品类
public class Product {
//初始值,即默认套餐
private String buildA = "汉堡";
private String buildB = "可乐";
private String buildC = "薯条";
private String buildD = "炸鸡";
public void setBuildA(String buildA) {
this.buildA = buildA;
}
public void setBuildB(String buildB) {
this.buildB = buildB;
}
public void setBuildC(String buildC) {
this.buildC = buildC;
}
public void setBuildD(String buildD) {
this.buildD = buildD;
}
@Override
public String toString() {
return "Product{" +
"buildA='" + buildA + '\'' +
", buildB='" + buildB + '\'' +
", buildC='" + buildC + '\'' +
", buildD='" + buildD + '\'' +
'}';
}
}
具体建造者
public class Worker implements Builder {
private Product product;
public Worker() {
product = new Product();
}
@Override
public Builder buildA(String msg) {
product.setBuildA(msg);
return this;
}
@Override
public Builder buildB(String msg) {
product.setBuildB(msg);
return this;
}
@Override
public Builder buildC(String msg) {
product.setBuildC(msg);
return this;
}
@Override
public Builder buildD(String msg) {
product.setBuildD(msg);
return this;
}
@Override
public Product getProduct() {
return product;
}
}
测试方法
public class Test {
public static void main(String[] args) {
//服务员
Worker worker = new Worker();
Product product = worker.buildA("鸡米花").getProduct();
System.out.println(product.toString());
//Product{buildA='鸡米花', buildB='可乐', buildC='薯条', buildD='炸鸡'}
//链式编程
Product product1 = worker.buildA("鸡排")
.buildB("牛肉汉堡")
.buildC("柠檬汁")
.getProduct();
System.out.println(product1.toString());
//Product{buildA='鸡排', buildB='牛肉汉堡', buildC='柠檬汁', buildD='炸鸡'}
}
}
事实上,在平时编写代码时,我们通常都会忽略对象的复杂性,优先考虑使用工厂模式创建对象,而不是建造者模式。因为工厂模式和建造者模式的作用都是创建一个产品对象,相对于建造者模式来说,工厂模式没有抽象建造者和指挥者,所以结构更加简洁直接,因此更常使用。
一般情况下,我们更习惯使用静态内部类的方式实现建造者模式,即一个产品类内部自动带有一个具体建造者,由它负责该产品的组装创建,不再需要 Builder 和 Director。这样做可以使产品表示与创建之间的联系更加紧密,结构更加紧凑,同时使得建造者模式更加简洁。
产品类
public class Product {
private String buildA = "汉堡";
private String buildB = "可乐";
private String buildC = "薯条";
private String buildD = "炸鸡";
public void setBuildA(String buildA) {
this.buildA = buildA;
}
public void setBuildB(String buildB) {
this.buildB = buildB;
}
public void setBuildC(String buildC) {
this.buildC = buildC;
}
public void setBuildD(String buildD) {
this.buildD = buildD;
}
@Override
public String toString() {
return "Product{" +
"buildA='" + buildA + '\'' +
", buildB='" + buildB + '\'' +
", buildC='" + buildC + '\'' +
", buildD='" + buildD + '\'' +
'}';
}
//静态内部类
public static class Builder {
private Product product = new Product();
public Builder buildA(String msg) {
product.setBuildA(msg);
return this;
}
public Builder buildB(String msg) {
product.setBuildB(msg);
return this;
}
public Builder buildC(String msg) {
product.setBuildC(msg);
return this;
}
public Builder buildD(String msg) {
product.setBuildD(msg);
return this;
}
public Product getProduct() {
return product;
}
}
}
测试方法
public class Test {
public static void main(String[] args) {
Product product = new Product.Builder()
.buildA("香辣鸡腿堡")
.buildB("墨西哥鸡肉卷")
.buildC("提拉米苏")
.buildD("冰阔落")
.getProduct();
System.out.println(product.toString());
//Product{buildA='香辣鸡腿堡', buildB='墨西哥鸡肉卷', buildC='提拉米苏', buildD='冰阔落'}
}
}
优点:
缺点: