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]

总结

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

相关推荐
蚂蚁集团分布式架构1 小时前
Koupleless 助力「人力家」实现分布式研发集中式部署,又快又省!
后端·设计模式·开源
三天不学习3 小时前
23种设计模式之单例模式(Singleton Pattern)【设计模式】
java·单例模式·设计模式·c#
每天减 1/5kg3 小时前
创建者——建造者模式
开发语言·python·建造者模式
长勺3 小时前
建造者模式
建造者模式
节点。csn5 小时前
java 项目中设计模式 之单例模式
java·单例模式·设计模式
三天不学习5 小时前
23种设计模式之工厂方法模式(Factory Method Pattern)【设计模式】
设计模式·c#·工厂方法模式
被遗忘的南极熊6 小时前
设计模式:记录所有设计模式方便后续复习
设计模式
郑祎亦7 小时前
【JAVA面试题】设计模式之原型模式
java·设计模式·原型模式
LuckyLay7 小时前
Golang学习笔记_42——迭代器模式
笔记·学习·设计模式·golang·迭代器模式