工厂模式属于创建型设计模式,核心思想:封装对象创建逻辑,统一生产对象,隔离对象创建与使用。
工厂模式分三大类:
-
简单工厂(静态工厂)
1 个工厂 + N 个产品,工厂依赖抽象产品
-
工厂方法
N 个工厂 + N 个产品,1 个工厂对应 1 个产品
-
抽象工厂
N 个工厂 + 多组产品(产品族),1 个工厂对应一整套产品
一、简单工厂模式(Simple Factory)
1. 定义
由一个工厂类 负责创建所有产品实例,根据传入参数决定创建哪一个对象。不属于 GoF 23 种标准设计模式
2. 角色
-
抽象产品:产品统一接口/父类
-
具体产品:接口实现类
-
工厂类:核心,包含创建对象逻辑
3. 适用场景
产品种类少、创建逻辑简单,客户端只需传入标识就能获取对象。
4. 代码和UMl类图

// 1. 抽象产品
public interface Fruit {
void eat();
}
// 2. 具体产品
class Apple implements Fruit {
@Override
public void eat() {
System.out.println("吃苹果");
}
}
class Banana implements Fruit {
@Override
public void eat() {
System.out.println("吃香蕉");
}
}
// 3. 工厂类
class FruitFactory {
// 静态方法:简单工厂核心
public static Fruit createFruit(String type) {
if ("apple".equals(type)) {
return new Apple();
} else if ("banana".equals(type)) {
return new Banana();
}
return null;
}
}
// 客户端
public class Client {
public static void main(String[] args) {
Fruit apple = FruitFactory.createFruit("apple");
apple.eat();
}
}
5. 优缺点
-
优点:创建逻辑集中,客户端不用
new对象 -
缺点:违背开闭原则,新增产品必须修改工厂代码;产品多时代码臃肿
二、工厂方法模式(Factory Method)⭐ 标准23种模式之一
1. 定义
一个产品对应一个工厂 ,定义抽象工厂接口,让具体工厂创建对应具体产品。
完全遵循开闭原则:新增产品只需要新增对应工厂,不修改原有代码。
2. 角色
-
抽象产品
-
具体产品
-
抽象工厂:定义创建产品的抽象方法
-
具体工厂:实现抽象工厂,生产对应产品
3. 适用场景
产品种类较多,且频繁新增产品,需要严格遵守开闭原则。
4. 代码和uml类型图

// 1. 抽象产品
public interface Fruit {
void eat();
}
// 具体产品
class Apple implements Fruit {
@Override
public void eat() { System.out.println("吃苹果"); }
}
class Banana implements Fruit {
@Override
public void eat() { System.out.println("吃香蕉"); }
}
// 2. 抽象工厂
public interface FruitFactory {
Fruit createFruit();
}
// 3. 具体工厂
class AppleFactory implements FruitFactory {
@Override
public Fruit createFruit() {
return new Apple();
}
}
class BananaFactory implements FruitFactory {
@Override
public Fruit createFruit() {
return new Banana();
}
}
// 客户端
public class Client {
public static void main(String[] args) {
FruitFactory factory = new AppleFactory();
Fruit fruit = factory.createFruit();
fruit.eat();
}
}
5. 优缺点
-
优点:遵守开闭原则;单一职责,一个工厂只生产一种产品
-
缺点:类数量爆炸,每加一个产品就要加一个工厂类
三、抽象工厂模式(Abstract Factory)⭐ 标准23种模式之一
1. 定义
工厂生产「产品族」,而非单个产品。
-
产品族:一组相关/配套的产品(如:手机 + 耳机 一套数码产品)
-
产品等级:同类型不同品牌(如:小米手机、华为手机)
2. 核心区别(对比工厂方法)
-
工厂方法:一个工厂只生产一类产品(单一产品)
-
抽象工厂:一个工厂生产一整套产品(产品族)
3. 角色
-
抽象产品(多个:产品A、产品B)
-
具体产品
-
抽象工厂:定义多个创建方法,对应不同产品
-
具体工厂:实现整套产品的创建
4. 适用场景
系统存在多组配套产品,产品之间有约束、必须搭配使用。
5. 代码(Java)和uml类图
场景:数码产品族(手机、耳机),两个品牌:小米、华为

// ===== 抽象产品 =====
// 手机抽象
public interface Phone {
void call();
}
// 耳机抽象
public interface Headset {
void listen();
}
// ===== 具体产品 =====
// 小米产品
class XiaomiPhone implements Phone {
@Override
public void call() { System.out.println("小米手机通话"); }
}
class XiaomiHeadset implements Headset {
@Override
public void listen() { System.out.println("小米耳机听歌"); }
}
// 华为产品
class HuaweiPhone implements Phone {
@Override
public void call() { System.out.println("华为手机通话"); }
}
class HuaweiHeadset implements Headset {
@Override
public void listen() { System.out.println("华为耳机听歌"); }
}
// ===== 抽象工厂(生产整套产品) =====
public interface DigitalFactory {
Phone createPhone();
Headset createHeadset();
}
// ===== 具体工厂(品牌工厂,生产整个产品族) =====
class XiaomiFactory implements DigitalFactory {
@Override
public Phone createPhone() { return new XiaomiPhone(); }
@Override
public Headset createHeadset() { return new XiaomiHeadset(); }
}
class HuaweiFactory implements DigitalFactory {
@Override
public Phone createPhone() { return new HuaweiPhone(); }
@Override
public Headset createHeadset() { return new HuaweiHeadset(); }
}
// 客户端
public class Client {
public static void main(String[] args) {
DigitalFactory factory = new XiaomiFactory();
Phone phone = factory.createPhone();
Headset headset = factory.createHeadset();
phone.call();
headset.listen();
}
}
6. 优缺点
-
优点:保证产品族配套使用;新增品牌工厂方便(苹果工厂),符合开闭
-
缺点:新增产品等级非常麻烦(比如新增「手表」,所有工厂都要改)
四、三种工厂模式对比总结
| 模式 | 特点 | 开闭原则 | 适用场景 |
|---|---|---|---|
| 简单工厂 | 单工厂、多产品,靠参数判断 | 不满足 | 产品固定、很少新增 |
| 工厂方法 | 一产品对应一工厂 | 满足 | 单一产品类型,频繁加产品 |
| 抽象工厂 | 工厂生产整套产品族 | 产品族扩展友好,产品等级扩展困难 | 多组配套产品 |
五、实际开发使用建议
-
简单工厂:日常快速开发、工具类、内部组件最常用
-
工厂方法:框架、开源组件、需要持续迭代扩展的模块
-
抽象工厂:电商多产品线、软硬件配套、跨平台多组件场景
六、常见面试考点
-
工厂模式的作用:解耦对象创建与使用、统一管理实例、屏蔽创建细节
-
简单工厂为什么不算标准23种设计模式?破坏开闭原则
-
工厂方法 vs 抽象工厂:单一产品 vs 产品族
-
开闭原则在三种模式中的体现