它提供了一种创建对象的最佳方式。
定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示;
主要作用:在用户不知道对象的建造过程和细节的情况下就可以直接创建复杂的对象
用户只需要给出指定复杂对象的类型和内容,建造者模式负责按顺序创建复杂对象(把内部的建造过程和细节隐藏起来)
例子:
- 工厂(建造者模式) :负责制造汽车(组装过程和细节在工厂内)
- 汽车购买者(用户) :你只需要说出你需要的型号(对象的类型和内容) ,然后直接购买就可以使用了(不需要知道汽车是怎么组装的(车轮、车门、发动机、方向盘等等) )
一个产品类(定义产品的各个属性)
一个建造者接口-抽象的BUILDER(需要知道建造一个产品需要哪些步骤,且获得产品的方法)
一个工人类-具体的BUILDER(实现建造者接口,,且定义一个属性 为产品,且构造器返回这个空产品)
从而可以根据重新建造者接口的方法,来分封装自己定义的属性 -产品,然后在重新的获得产品的方法里面返回这个属性 - 产品
假设造房简化为如下步骤:(1)地基 (2)钢筋工程 (3) 铺电线 (4)粉刷;
“如果”要盖- -座房子,
首先要找一个建筑公司或工程承包商(指挥者)。
承包商指挥工人(具体建造者)过来造房子(产品) ,
最后验收。
有两种实现方式
方式一
方式二
方法一由于显示情况是一般是客户就是指挥者,由客户自定义需求,因此需要改进代码,来试下你自定义创造
package builder.builder2;
public abstract class Builder {
// 注意这里的返回值是Builder,而是void,方便链式编程
public abstract Builder buildA(String msg); //汉堡
public abstract Builder buildB(String msg); //薯条
public abstract Builder buildC(String msg); //可乐
public abstract Builder buildD(String msg); //鸡肉卷
public abstract Product getProduct();
}
package builder.builder2;
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 + '\'' +
'}';
}
}
package builder.builder2;
public class Worker extends Builder {
private Product product;
public Worker() {
product=new Product();
}
@Override
public Builder buildA(String msg) {
product.setBuildA(msg);
return this; // 注意这里返回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;
}
}
package builder.builder2;
public class Test {
public static void main(String[] args) {
Worker worker = new Worker();
// 链式编程,这样就能实现自定义建造
Product product = worker.buildA("全家桶").buildB("雪碧")
.getProduct();
System.out.println(product.toString());
}
}