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

一、定义:

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

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

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

二、建造者模式结构

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

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

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

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

三、建造者模式实现

1. 产品类(Product)
java 复制代码
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)
java 复制代码
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)
java 复制代码
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)
java 复制代码
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. 客户端代码
java 复制代码
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);
    }
}

输出结果

java 复制代码
Product [partA=A1, partB=B1, partC=C1]

进一步扩展

1. 多个具体建造者

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

java 复制代码
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. 客户端代码扩展
java 复制代码
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);
    }
}

输出结果

java 复制代码
Product 1: Product [partA=A1, partB=B1, partC=C1]
Product 2: Product [partA=A2, partB=B2, partC=C2]

总结

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

相关推荐
杯子不吃紫菜12 小时前
LangGraph 体系实战(下):中断恢复、流式、子图与设计模式
单片机·嵌入式硬件·设计模式
是2的10次方啊15 小时前
设计模式与生活⑳:楼里的事都找前台,你就再没见过师傅
设计模式
是2的10次方啊2 天前
设计模式与生活⑲:投影连不上,别急着换投影仪
设计模式
cjz38992 天前
规则树:把一百行if-else拆成一棵树
设计模式
Adellle3 天前
设计模式指南 (Java 版) ㊁
java·开发语言·设计模式
是2的10次方啊3 天前
设计模式与生活⑱:工资还没焐热,账单已经凑成一摞
设计模式
百思不得小李3 天前
一个复杂的动态表单是如何实现的
前端·设计模式
爱你真是太好了3 天前
上下文组成以及如何压缩
设计模式
freejackman3 天前
【工程化】从“单兵作战”到“多引擎架构”:基于门面模式的重构实战
大数据·数据库·hive·sql·测试工具·设计模式·架构
Java成神之路-4 天前
从 if-else 到优雅解耦:策略 / 适配器 / 组合模式全流程实战
设计模式