Java设计模式——建造者模式

发布于:2025-03-04 ⋅ 阅读:(14) ⋅ 点赞:(0)

一、定义:

建造者模式是一种较为复杂的创建型模式。

定义:将一个复杂对象的构建与他的表示分离,使得同样的构建过程可以创建不同的表示。

建造者模式是一种对象创建型模式,他将客户端与包含多个部件的复杂对象的创建过程分离,客户端无须知道复杂对象的内部组成部分与装配方式,只需要知道所需建造者的类型即可。建造者模式关注如何一步一步地创建一个复杂对象,不同的建造者定义了不同的创建过程。

二、建造者模式结构

1)Builder(抽象建造者):他为创建一个产品对象的各个部件指定抽象接口,在该接口中一般声明两类方法,一类方法时build Part X(),它们用于创建复杂对象的各个部件;另一类方法是getResult(),它们用与返回复杂对象,Builder既可以是抽象和类,也可以是接口。

2)ConcreteBuilder(具体建造者):它实现了Builder接口,实现各个部件的具体构造和装配方法,定义并明确所创建的复杂对象,还可以提供一个方法放回创建好的复杂产品对象。

3)Product(产品):它是被构建的复杂对象,包含多个组成部件,具体建造者创建该产品的内部标室并定义它的装配过程。

4)Director(指挥者):指挥者又称为导演类,他负责安排复杂对象的建造次序,指挥者雨抽象建造者之间存在关联关系,可以在其construct()建造方法中调用建造者对象的部件构造与装配方法,完成复杂对象的建造。

三、建造者模式实现

1. 产品类(Product)
public class Product {
    private String partA;
    private String partB;
    private String partC;
​
    public void setPartA(String partA) {
        this.partA = partA;
    }
​
    public void setPartB(String partB) {
        this.partB = partB;
    }
​
    public void setPartC(String partC) {
        this.partC = partC;
    }
​
    @Override
    public String toString() {
        return "Product [partA=" + partA + ", partB=" + partB + ", partC=" + partC + "]";
    }
}
2. 抽象建造者类(Builder)
public abstract class Builder {
    // 创建产品对象
    protected Product product = new Product();
​
    public abstract void buildPartA();
    public abstract void buildPartB();
    public abstract void buildPartC();
​
    // 返回产品对象
    public Product getResult() {
        return product;
    }
}
3. 具体建造者类(ConcreteBuilder)
public class ConcreteBuilder1 extends Builder {
    @Override
    public void buildPartA() {
        product.setPartA("A1");
    }
​
    @Override
    public void buildPartB() {
        product.setPartB("B1");
    }
​
    @Override
    public void buildPartC() {
        product.setPartC("C1");
    }
}
4. 指挥者类(Director)
public class Director {
    private Builder builder;
​
    public Director(Builder builder) {
        this.builder = builder;
    }
​
    public void setBuilder(Builder builder) {
        this.builder = builder;
    }
​
    // 产品构建与组装方法
    public Product construct() {
        builder.buildPartA();
        builder.buildPartB();
        builder.buildPartC();
        return builder.getResult();
    }
}
5. 客户端代码
public class Client {
    public static void main(String[] args) {
        Builder builder = new ConcreteBuilder1(); // 可以通过配置文件实现
        Director director = new Director(builder);
        Product product = director.construct();
​
        System.out.println(product);
    }
}

输出结果

Product [partA=A1, partB=B1, partC=C1]

进一步扩展

1. 多个具体建造者

我们可以定义多个具体建造者,每个建造者负责构建不同配置的产品。

public class ConcreteBuilder2 extends Builder {
    @Override
    public void buildPartA() {
        product.setPartA("A2");
    }
​
    @Override
    public void buildPartB() {
        product.setPartB("B2");
    }
​
    @Override
    public void buildPartC() {
        product.setPartC("C2");
    }
}
2. 客户端代码扩展
public class Client {
    public static void main(String[] args) {
        Builder builder1 = new ConcreteBuilder1();
        Director director1 = new Director(builder1);
        Product product1 = director1.construct();
        System.out.println("Product 1: " + product1);
​
        Builder builder2 = new ConcreteBuilder2();
        Director director2 = new Director(builder2);
        Product product2 = director2.construct();
        System.out.println("Product 2: " + product2);
    }
}

输出结果

Product 1: Product [partA=A1, partB=B1, partC=C1]
Product 2: Product [partA=A2, partB=B2, partC=C2]

总结

建造者模式通过将复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。它适用于构建复杂对象,尤其是当对象的构造过程需要逐步进行或包含多个可选参数时。通过使用建造者模式,客户端代码可以更加简洁,并且可以灵活地切换不同的建造者来创建不同的产品。