比如建造一台电脑,按照固定的步骤(先装CPU,再装内存,最后装硬盘)组装出不同配置的电脑。只要你提出自己的要求,就会给你组装出一台你所需要的高配或者低配的电脑。
- 产品类(要构建的复杂对象)
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 + "]";
}
}
- 使用建造者创建对象
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 格式的报告,报告包含标题、内容和页脚。
- 定义报告对象和建造者接口
// 产品类:报告
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();
}
- 具体建造者实现
// 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;
}
}
- 指挥者(控制建造步骤)
public class Director {
public Report construct(ReportBuilder builder) {
builder.buildTitle();
builder.buildContent();
builder.buildFooter();
return builder.getResult();
}
}
- 客户端调用
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();
}
}