建造者模式是一种创建型设计模式,它允许你构建一个复杂对象的过程与其表示分离,使得同样的构建过程可以创建不同的表示。

结构

  • 产品类(Product): 定义了要构建的复杂对象。
public class Product {
    private String part1;
    private String part2;

    public void setPart1(String part1) {
        this.part1 = part1;
    }

    public void setPart2(String part2) {
        this.part2 = part2;
    }

    // 其他属性和方法
}
  • 抽象建造者类(Builder): 定义了构建产品的抽象方法。
public abstract class Builder {
    protected Product product = new Product();

    public abstract void buildPart1();
    public abstract void buildPart2();

    public Product getProduct() {
        return product;
    }
}
  • 具体建造者类(Concrete Builder): 实现了抽象建造者类,负责具体的构建过程。
public class ConcreteBuilder extends Builder {
    public void buildPart1() {
        product.setPart1("Part 1");
    }

    public void buildPart2() {
        product.setPart2("Part 2");
    }
}
  • 指挥者类(Director): 负责使用建造者来构建复杂对象。
public class Director {
    private Builder builder;

    public Director(Builder builder) {
        this.builder = builder;
    }

    public void construct() {
        builder.buildPart1();
        builder.buildPart2();
    }
}

优点和缺点

优点:

  1. 分离构建过程和表示: 建造者模式将构建过程和表示分离,允许你按步骤构造复杂对象,同时使用相同的构建过程来创建不同的表示。
  2. 更好的控制对象构建: 指挥者负责控制构建过程,可以保证对象的完整性。
  3. 易于扩展: 可以新增具体的建造者类,不影响已有代码,符合开闭原则。

缺点:

  1. 增加了类的个数: 引入了建造者模式会增加系统中类的数量,增加了代码复杂度。
  2. 不适用于简单对象的构建: 如果对象的构建逻辑非常简单,使用建造者模式可能会显得繁琐。

示例

以下是一个建造者模式的示例,构建一个包含两个部分的产品对象:

// 产品类
public class Product {
    private String part1;
    private String part2;

    public void setPart1(String part1) {
        this.part1 = part1;
    }

    public void setPart2(String part2) {
        this.part2 = part2;
    }

    @Override
    public String toString() {
        return "Part 1: " + part1 + ", Part 2: " + part2;
    }
}

// 抽象建造者类
public abstract class Builder {
    protected Product product = new Product();

    public abstract void buildPart1();
    public abstract void buildPart2();

    public Product getProduct() {
        return product;
    }
}

// 具体建造者类
public class ConcreteBuilder extends Builder {
    public void buildPart1() {
        product.setPart1("Part 1");
    }

    public void buildPart2() {
        product.setPart2("Part 2");
    }
}

// 指挥者类
public class Director {
    private Builder builder;

    public Director(Builder builder) {
        this.builder = builder;
    }

    public void construct() {
        builder.buildPart1();
        builder.buildPart2();
    }
}

// 客户端代码
public class Main {
    public static void main(String[] args) {
        Builder builder = new ConcreteBuilder();
        Director director = new Director(builder);
        director.construct();

        Product product = builder.getProduct();
        System.out.println(product);
    }
}

在这个示例中,Director 负责控制构建过程,ConcreteBuilder 负责具体的构建逻辑。通过建造者模式,我们可以按照不同的构建过程创建不同的产品对象。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注