【设计模式】建造者模式

发布于:2025-04-02 ⋅ 阅读:(17) ⋅ 点赞:(0)

比如建造一台电脑,按照固定的步骤(先装CPU,再装内存,最后装硬盘)组装出不同配置的电脑。只要你提出自己的要求,就会给你组装出一台你所需要的高配或者低配的电脑。

  1. 产品类(要构建的复杂对象)
public class Computer {
    private String cpu;
    private String ram;
    private String storage;

    // 私有构造方法,只能通过建造者创建
    private Computer(Builder builder) {
        this.cpu = builder.cpu;
        this.ram = builder.ram;
        this.storage = builder.storage;
    }

    // 静态内部类建造者(经典实现)
    public static class Builder {
        private String cpu;
        private String ram;
        private String storage;

        public Builder setCpu(String cpu) {
            this.cpu = cpu;
            return this;
        }

        public Builder setRam(String ram) {
            this.ram = ram;
            return this;
        }

        public Builder setStorage(String storage) {
            this.storage = storage;
            return this;
        }

        public Computer build() {
            return new Computer(this);
        }
    }

    @Override
    public String toString() {
        return "Computer [cpu=" + cpu + ", ram=" + ram + ", storage=" + storage + "]";
    }
}
  1. 使用建造者创建对象
public class Client {
    public static void main(String[] args) {
        Computer highEndComputer = new Computer.Builder()
                .setCpu("Intel i9")
                .setRam("32GB DDR4")
                .setStorage("2TB NVMe SSD")
                .build();

        Computer lowEndComputer = new Computer.Builder()
                .setCpu("Intel i3")
                .setRam("8GB DDR4")
                .setStorage("500GB HDD")
                .build();

        System.out.println("高配电脑: " + highEndComputer);
        System.out.println("低配电脑: " + lowEndComputer);
    }
}

应用场景案例代码:生成不同格式报告
场景描述
需要生成 PDF 和 HTML 格式的报告,报告包含标题、内容和页脚。

  1. 定义报告对象和建造者接口
// 产品类:报告
public class Report {
    private String title;
    private String content;
    private String footer;

    public void setTitle(String title) { this.title = title; }
    public void setContent(String content) { this.content = content; }
    public void setFooter(String footer) { this.footer = footer; }

    public void display() {
        System.out.println("标题: " + title);
        System.out.println("内容: " + content);
        System.out.println("页脚: " + footer);
    }
}
// 抽象建造者接口
public interface ReportBuilder {
    void buildTitle();
    void buildContent();
    void buildFooter();
    Report getResult();
}
  1. 具体建造者实现
// PDF 报告建造者
public class PdfReportBuilder implements ReportBuilder {
    private Report report = new Report();

    @Override
    public void buildTitle() {
        report.setTitle("PDF 报告标题");
    }

    @Override
    public void buildContent() {
        report.setContent("PDF 报告内容...");
    }

    @Override
    public void buildFooter() {
        report.setFooter("PDF 页脚 - 第1页");
    }

    @Override
    public Report getResult() {
        return report;
    }
}

// HTML 报告建造者

public class HtmlReportBuilder implements ReportBuilder {
    private Report report = new Report();

    @Override
    public void buildTitle() {
        report.setTitle("<h1>HTML 报告标题</h1>");
    }

    @Override
    public void buildContent() {
        report.setContent("<p>HTML 报告内容...</p>");
    }

    @Override
    public void buildFooter() {
        report.setFooter("<footer>HTML 页脚</footer>");
    }

    @Override
    public Report getResult() {
        return report;
    }
}
  1. 指挥者(控制建造步骤)
public class Director {
    public Report construct(ReportBuilder builder) {
        builder.buildTitle();
        builder.buildContent();
        builder.buildFooter();
        return builder.getResult();
    }
}
  1. 客户端调用
public class ReportClient {
    public static void main(String[] args) {
        Director director = new Director();

        // 生成 PDF 报告
        Report pdfReport = director.construct(new PdfReportBuilder());
        System.out.println("=== PDF 报告 ===");
        pdfReport.display();

        // 生成 HTML 报告
        Report htmlReport = director.construct(new HtmlReportBuilder());
        System.out.println("\n=== HTML 报告 ===");
        htmlReport.display();
    }
}

网站公告

今日签到

点亮在社区的每一天
去签到