很多刚开始学 Java 设计模式的同学,一看到“工厂模式”和“单例模式”,都会冒出一句:
“这俩不都是在搞对象吗?到底有什么区别?”
确实,这两个模式都属于 创建型设计模式,都和“怎么创建对象”有关。
但其实它们关注的重点完全不一样!
今天这篇文章,我们就一起来用简单的例子和清晰的对比,彻底搞懂这两个模式。

一,什么是工厂模式(Factory Pattern)?

我们先从“工厂”说起。
想象一下你开了一家形状工厂,专门生产不同形状的图形对象:圆形、正方形、三角形……
客户只要告诉你要哪种,你就帮他造出来。客户不需要知道你内部是怎么造的。
这就是工厂模式的核心思想👇
👉 把对象的创建逻辑封装起来,让使用者只管拿对象,不用管怎么创建。
举个例子:Shape 工厂

// 定义接口
interface Shape {
    void draw();
}

// 实现类
class Circle implements Shape {
    public void draw() {
        System.out.println("画一个圆形");
    }
}

class Square implements Shape {
    public void draw() {
        System.out.println("画一个正方形");
    }
}

// 工厂类
class ShapeFactory {
    public Shape getShape(String type) {
        if (type.equalsIgnoreCase("circle")) {
            return new Circle();
        } else if (type.equalsIgnoreCase("square")) {
            return new Square();
        }
        return null;
    }
}

// 测试
public class FactoryDemo {
    public static void main(String[] args) {
        ShapeFactory factory = new ShapeFactory();
        Shape shape1 = factory.getShape("circle");
        shape1.draw();
        Shape shape2 = factory.getShape("square");
        shape2.draw();
    }
}

运行结果:

画一个圆形
画一个正方形

工厂模式做了什么?

  • 封装了“创建对象”的过程;
  • 调用方不需要知道 new Circle() 或 new Square();
  • 当要增加一个新图形,只要新增一个类,不需要改调用逻辑。

适合场景:
当你发现项目里出现大量的 new、并且这些对象类型常变动时,就该考虑用工厂模式了。


二、什么是单例模式(Singleton Pattern)?

再来看单例模式。
顾名思义,“单例”就是全局唯一的一个实例。
比如一个系统里:

  • 日志记录器(Logger)
  • 配置管理器(ConfigManager)
  • 数据库连接池(DBConnectionPool)

这些资源我们希望全局共用一个对象,而不是每次都创建新的。

举个例子:经典懒汉式单例

public class Singleton {
    // 1. 私有构造器,防止外部 new
    private Singleton() {}

    // 2. 持有唯一实例(懒加载)
    private static Singleton instance;

    // 3. 提供全局访问方法
    public static Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }

    public void showMessage() {
        System.out.println("我是唯一的单例对象!");
    }
}

public class SingletonDemo {
    public static void main(String[] args) {
        Singleton s1 = Singleton.getInstance();
        Singleton s2 = Singleton.getInstance();

        System.out.println(s1 == s2); // true
        s1.showMessage();
    }
}

运行结果:

true
我是唯一的单例对象!

单例模式做了什么?

  • 限制一个类只能创建一个实例;
  • 提供一个全局访问点;
  • 节省资源、方便管理。

适合场景:
当系统中只需要一个对象来协调全局行为(比如日志、配置、缓存等)。


三、工厂模式 vs 单例模式:核心区别

很多人混淆它俩的原因,是因为它们都“创建对象”。
下面我用一个表格进行对这两个模式进行简单明了的对比:

对比项工厂模式单例模式
核心目的封装创建逻辑确保唯一实例
生成对象数量每次调用可创建多个不同对象无论调用多少次,都是同一个对象
谁在被创建各种“产品对象”(Circle、Square等)模式本身代表的那个类(Singleton)
常用场景解耦对象创建,方便扩展管理全局唯一资源
示例ShapeFactory → 创建图形ConfigManager → 管理配置

一句话概括:
工厂是“造不同对象的工厂”;
单例是“全局唯一的自己”。


四,总结

模式关键词主要作用
工厂模式“生产对象”封装对象创建逻辑,便于扩展
单例模式“唯一对象”控制实例数量,提供全局访问点
Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐