在学习 Java 设计模式时,很多同学经常会混淆 工厂模式 和 建造者模式。
它们同属于创建型模式,但关注点完全不同:工厂更像是点外卖——告诉工厂要“游戏电脑”还是“办公电脑”,立刻给你成品;建造者则像是定制套餐——一步步选择 CPU、显卡、内存,最后组装成完整机器。
这篇文章,我将通过 原理对比 + Java 代码示例 + 优缺点分析,带你彻底搞懂二者的区别。
一、工厂模式(Factory Pattern)
1. 核心思想
-
客户端只需告诉工厂“我要什么类型”,工厂直接返回成品对象。
-
适合对象结构不复杂、只需要选择不同类型的场景。
2. 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
二、建造者模式(Builder Pattern)
1. 核心思想
-
关注对象的 组装过程,可以一步步灵活指定配置。
-
适合构造复杂对象,尤其是需要定制化的场景。
2. Java 示例代码
// 建造者
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
三、工厂模式 vs 建造者模式 对比
| 对比项 | 工厂模式(Factory) | 建造者模式(Builder) |
|---|---|---|
| 关注点 | 选择并创建某一类对象 | 一步步组装复杂对象 |
| 产品复杂度 | 产品结构简单,直接 new 出来即可 | 产品往往由多个部件/步骤组成 |
| 客户端角色 | 只关心“要什么型号” | 可以灵活指定“配置/步骤” |
| 适用场景 | - 多个子类/实现类 - 需要隐藏创建逻辑 | - 对象构造复杂 - 对象需要灵活配置 |
| 优点 | - 简化对象创建 - 隐藏 new 逻辑 - 统一管理产品 | - 更灵活 - 可以复用建造步骤 - 易于扩展配置 |
| 缺点 | - 扩展产品需要改工厂代码 - 配置不够灵活 | - 类数量多 - 对简单对象反而臃肿 |
| 类比 | 点外卖 🍔 → 直接拿到套餐 | 定制套餐 🍱 → 选主食、小菜、饮料 |
四、总结
-
工厂模式:适合“成品化”场景,客户端只需知道要什么型号,不关心构造细节。
-
建造者模式:适合“定制化”场景,客户端可以一步步配置,灵活度更高。
👉 所以,如果你的对象像点外卖一样,选个类型就能直接用,那用工厂模式;如果像定制套餐一样,需要自己组合配置,那用建造者模式。
五、实际项目中的应用场景
1. 工厂模式应用案例
在 Java 开发中,工厂模式几乎无处不在:
建造者模式常用于 对象构建复杂、参数多且灵活 的场景。
2. 建造者模式应用案例
-
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)
-
工厂模式 = 点外卖(我要现成的成品)
-
建造者模式 = 定制套餐(我要灵活组合配置)
-
写代码就像点餐:工厂模式让你点好套餐直接开吃,建造者模式让你自由搭配成专属口味。关键是——你要吃饱,还要吃好。
562

被折叠的 条评论
为什么被折叠?



