一文搞懂 Java 工厂模式 vs 单例模式:到底哪里不一样?
·
很多刚开始学 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 → 管理配置 |
一句话概括:
工厂是“造不同对象的工厂”;
单例是“全局唯一的自己”。
四,总结
| 模式 | 关键词 | 主要作用 |
|---|---|---|
| 工厂模式 | “生产对象” | 封装对象创建逻辑,便于扩展 |
| 单例模式 | “唯一对象” | 控制实例数量,提供全局访问点 |
更多推荐


所有评论(0)