目录
1.核心本质
提供创建对象的最佳方式,工厂类似于创造出零件,建造者负责把零件拼装起来
适用于:有复杂的对象属性,但是对象的属性具有共同性。
2.建造者的组成部分
Builder(构建者): 定义创建对象各部分的接口。通常包括构建对象的各个步骤的方法。
ConcreteBuilder(具体构建者): 实现 Builder 接口,实现各个构建步骤的具体逻辑,并且能够返回构建好的对象。
Director(指挥者): 负责使用 Builder 接口的对象来构建对象。Director 决定构建的步骤顺序,以及在何时使用 Builder 来构建对象。
Product(产品): 要创建的复杂对象。Builder 构建对象的各个部分,最终返回一个完整的产品。
3.代码示例
3.1 指挥者控制
由指挥者控制建造,适合固定属性。
3.1.1 建造者(使用接口创建)
public interface Builder {
void buildPartA();
void buildPartB();
void buildPartC();
Product getResult();// 获取产品对象
}
3.1.2 具体建造者
public class ConcreteBuilder implements Builder {
private Product product;
public ConcreteBuilder(){
product=new Product();
}
@Override
public void buildPartA() {
product.setPartA("拼装主机");
System.out.println("拼装主机");
}
@Override
public void buildPartB() {
product.setPartB("连接屏幕");
System.out.println("连接屏幕");
}
@Override
public void buildPartC() {
product.setPartC("连接键鼠");
System.out.println("连接键鼠");
}
@Override
public Product getResult() {
System.out.println(product.toString());
return product;
}
}
3.1.3 产品
public class Product {
//建造者模式
//产品类
//产品类包含多个部件,并且提供设置和获取部件的接口
String partA;
String partB;
String partC;
public String getPartA() {
return partA;
}
public void setPartA(String partA) {
this.partA = partA;
}
public String getPartB() {
return partB;
}
public void setPartB(String partB) {
this.partB = partB;
}
public String getPartC() {
return partC;
}
public void setPartC(String partC) {
this.partC = partC;
}
@Override
public String toString() {
return "Product{" +
"partA='" + partA + '\'' +
", partB='" + partB + '\'' +
", partC='" + partC + '\'' +
'}';
}
}
3.1.4 指挥者
public class Director {
public void getProduct(Builder builder){
builder.buildPartA();
builder.buildPartC();
builder.buildPartB();
builder.getResult();
}
}
3.1.5 测试
public class Test {
public static void main(String[] args) {
Director director = new Director();
director.getProduct(new ConcreteBuilder());
}
}
3.2 具体建造者控制
可以灵活赋值
3.2.1 建造者(使用抽象类创建)
abstract class Builder {
abstract Builder buildPartA(String food);
abstract Builder buildPartB(String food);
abstract Builder buildPartC(String food);
abstract Product getResult();// 获取产品对象
}
3.2.2 具体建造者
public class ConcreteBuilder extends Builder{
private Product product;
public ConcreteBuilder(){
product=new Product();
}
@Override
Builder buildPartA(String food) {
product.setPartA(food);
return this;
}
@Override
Builder buildPartB(String food) {
product.setPartB(food);
return this;
}
@Override
Builder buildPartC(String food) {
product.setPartC(food);
return this;
}
@Override
Product getResult() {
return product;
}
}
3.2.3 产品
public class Product {
//建造者模式
//产品类
//产品类包含多个部件,并且提供设置和获取部件的接口
String partA = "擀面皮";
String partB = "肉夹馍";
String partC = "冰封";
public String getPartA() {
return partA;
}
public void setPartA(String partA) {
this.partA = partA;
}
public String getPartB() {
return partB;
}
public void setPartB(String partB) {
this.partB = partB;
}
public String getPartC() {
return partC;
}
public void setPartC(String partC) {
this.partC = partC;
}
@Override
public String toString() {
return "Product{" +
"partA='" + partA + '\'' +
", partB='" + partB + '\'' +
", partC='" + partC + '\'' +
'}';
}
}
3.2.4 测试
public class Test {
public static void main(String[] args) {
ConcreteBuilder concreteBuilder = new ConcreteBuilder();
// Product result = concreteBuilder.getResult();
Product result = concreteBuilder.buildPartA("羊肉泡馍").buildPartC("辣子蒜羊血").getResult();
System.out.println(result.toString());
}
}