在学习 Java 设计模式时,很多同学经常会混淆 工厂模式 和 建造者模式。 它们同属于创建型模式,但关注点完全不同:工厂更像是点外卖——告诉工厂要“游戏电脑”还是“办公电脑”,立刻给你成品;建造者则像是定制套餐——一步步选择 CPU、显卡、内存,最后组装成完整机器。
这篇文章,我将通过 原理对比 + Java 代码示例 + 优缺点分析,带你彻底搞懂二者的区别。
// 产品类
class Computer {
private String cpu;
private String gpu;
private String ram;
public Computer(String cpu, String gpu, String ram) {
this.cpu = cpu;
this.gpu = gpu;
this.ram = ram;
}
public void showConfig() {
System.out.println("CPU: " + cpu + ", GPU: " + gpu + ", RAM: " + ram);
}
}
// 工厂类
class ComputerFactory {
public static Computer createComputer(String type) {
switch (type.toLowerCase()) {
case "gaming":
return new Computer("i9 CPU", "RTX 4090", "64GB RAM");
case "office":
return new Computer("i5 CPU", "集成显卡", "16GB RAM");
default:
return null;
}
}
}
// 客户端
public class FactoryDemo {
public static void main(String[] args) {
Computer gaming = ComputerFactory.createComputer("gaming");
Computer office = ComputerFactory.createComputer("office");
gaming.showConfig();
office.showConfig();
}
}输出:
CPU: i9 CPU, GPU: RTX 4090, RAM: 64GB RAM
CPU: i5 CPU, GPU: 集成显卡, RAM: 16GB RAM// 建造者
class ComputerBuilder {
private String cpu;
private String gpu;
private String ram;
public ComputerBuilder setCpu(String cpu) {
this.cpu = cpu;
return this;
}
public ComputerBuilder setGpu(String gpu) {
this.gpu = gpu;
return this;
}
public ComputerBuilder setRam(String ram) {
this.ram = ram;
return this;
}
public Computer build() {
return new Computer(cpu, gpu, ram);
}
}
// 客户端
public class BuilderDemo {
public static void main(String[] args) {
Computer gaming = new ComputerBuilder()
.setCpu("i9 CPU")
.setGpu("RTX 4090")
.setRam("64GB RAM")
.build();
Computer office = new ComputerBuilder()
.setCpu("i5 CPU")
.setGpu("集成显卡")
.setRam("16GB RAM")
.build();
gaming.showConfig();
office.showConfig();
}
}输出:
CPU: i9 CPU, GPU: RTX 4090, RAM: 64GB RAM
CPU: i5 CPU, GPU: 集成显卡, RAM: 16GB RAM对比项 | 工厂模式(Factory) | 建造者模式(Builder) |
|---|---|---|
关注点 | 选择并创建某一类对象 | 一步步组装复杂对象 |
产品复杂度 | 产品结构简单,直接 new 出来即可 | 产品往往由多个部件/步骤组成 |
客户端角色 | 只关心“要什么型号” | 可以灵活指定“配置/步骤” |
适用场景 | - 多个子类/实现类 - 需要隐藏创建逻辑 | - 对象构造复杂 - 对象需要灵活配置 |
优点 | - 简化对象创建 - 隐藏 new 逻辑 - 统一管理产品 | - 更灵活 - 可以复用建造步骤 - 易于扩展配置 |
缺点 | - 扩展产品需要改工厂代码 - 配置不够灵活 | - 类数量多 - 对简单对象反而臃肿 |
类比 | 点外卖 🍔 → 直接拿到套餐 | 定制套餐 🍱 → 选主食、小菜、饮料 |
👉 所以,如果你的对象像点外卖一样,选个类型就能直接用,那用工厂模式;如果像定制套餐一样,需要自己组合配置,那用建造者模式。
在 Java 开发中,工厂模式几乎无处不在:
建造者模式常用于 对象构建复杂、参数多且灵活 的场景。
Spring 的 BeanFactory / ApplicationContext
Spring 中的 BeanFactory 就是典型的工厂模式。我们只需要提供 Bean 的名字或类型,Spring 容器就会把实例化好的对象交给我们:
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
UserService userService = context.getBean("userService", UserService.class);👉 开发者不需要关心对象是怎么创建的(构造函数、依赖注入等),Spring 工厂帮你完成。
JDBC 的 DriverManager
通过 DriverManager.getConnection(url, user, password) 获取数据库连接,本质也是工厂方法模式。不同数据库(MySQL、Oracle)返回的都是 Connection 接口的不同实现类。
Lombok 的 @Builder 注解
我们经常在实体类上加上 @Builder,这就是建造者模式的自动化实现:
@Builder
public class User {
private String name;
private int age;
private String email;
}
// 使用方式
User user = User.builder()
.name("张三")
.age(20)
.email("zhangsan@test.com")
.build();👉 记住一句话:
👉 这种方式比写一堆构造函数要优雅得多,特别适合字段很多的对象。
StringBuilder / StringBuffer
这两个类就是典型的建造者模式。我们通过一连串的 append() 调用,最后生成需要的字符串。
String result = new StringBuilder()
.append("Hello ")
.append("World ")
.append(2025)
.toString();工厂模式:隐藏了对象创建逻辑,客户端只需“点单”,工厂负责“做菜”。(Spring BeanFactory、JDBC DriverManager)
建造者模式:关注对象的组装过程,支持链式调用和灵活定制。(Lombok @Builder、StringBuilder)
工厂模式 = 点外卖(我要现成的成品)
建造者模式 = 定制套餐(我要灵活组合配置)
写代码就像点餐:工厂模式让你点好套餐直接开吃,建造者模式让你自由搭配成专属口味。关键是——你要吃饱,还要吃好。