首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Java 设计模式详解:工厂模式与建造者模式的对比分析

Java 设计模式详解:工厂模式与建造者模式的对比分析

作者头像
伯灵
发布2026-01-21 09:54:53
发布2026-01-21 09:54:53
1170
举报

在学习 Java 设计模式时,很多同学经常会混淆 工厂模式建造者模式。 它们同属于创建型模式,但关注点完全不同:工厂更像是点外卖——告诉工厂要“游戏电脑”还是“办公电脑”,立刻给你成品;建造者则像是定制套餐——一步步选择 CPU、显卡、内存,最后组装成完整机器。

这篇文章,我将通过 原理对比 + Java 代码示例 + 优缺点分析,带你彻底搞懂二者的区别。

一、工厂模式(Factory Pattern)

1. 核心思想
  • 客户端只需告诉工厂“我要什么类型”,工厂直接返回成品对象。
  • 适合对象结构不复杂、只需要选择不同类型的场景。
2. Java 示例代码
代码语言:javascript
复制
// 产品类
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();
    }
}

输出:

代码语言:javascript
复制
CPU: i9 CPU, GPU: RTX 4090, RAM: 64GB RAM
CPU: i5 CPU, GPU: 集成显卡, RAM: 16GB RAM

二、建造者模式(Builder Pattern)

1. 核心思想
  • 关注对象的 组装过程,可以一步步灵活指定配置。
  • 适合构造复杂对象,尤其是需要定制化的场景。
2. Java 示例代码
代码语言:javascript
复制
// 建造者
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();
    }
}

输出:

代码语言:javascript
复制
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 容器就会把实例化好的对象交给我们:

代码语言:javascript
复制
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,这就是建造者模式的自动化实现:

代码语言:javascript
复制
@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() 调用,最后生成需要的字符串。

代码语言:javascript
复制
String result = new StringBuilder()
                    .append("Hello ")
                    .append("World ")
                    .append(2025)
                    .toString();

六、最后总结

工厂模式:隐藏了对象创建逻辑,客户端只需“点单”,工厂负责“做菜”。(Spring BeanFactory、JDBC DriverManager)

建造者模式:关注对象的组装过程,支持链式调用和灵活定制。(Lombok @Builder、StringBuilder)

工厂模式 = 点外卖(我要现成的成品)

建造者模式 = 定制套餐(我要灵活组合配置)

写代码就像点餐:工厂模式让你点好套餐直接开吃,建造者模式让你自由搭配成专属口味。关键是——你要吃饱,还要吃好。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-09-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、工厂模式(Factory Pattern)
    • 1. 核心思想
    • 2. Java 示例代码
  • 二、建造者模式(Builder Pattern)
    • 1. 核心思想
    • 2. Java 示例代码
  • 三、工厂模式 vs 建造者模式 对比
  • 四、总结
  • 五、实际项目中的应用场景
    • 1. 工厂模式应用案例
    • 2. 建造者模式应用案例
  • 六、最后总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档