工厂模式属于创建型设计模式,核心思想:封装对象创建逻辑,统一生产对象,隔离对象创建与使用。
工厂模式分三大类:
简单工厂(静态工厂)
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产品族
开闭原则在三种模式中的体现