工厂模式(面试版)
一、面试常考点
1. 工厂模式解决什么问题
把“对象创建逻辑”从业务代码中剥离,降低耦合。
2. 三种工厂如何区分
简单工厂:一个入口按参数分发;工厂方法:一个产品一个工厂;抽象工厂:创建“产品族”。
3. 面试追问点
新增产品时是否符合开闭原则、客户端是否感知具体类。
二、细节介绍
1. 核心思想
面向抽象编程,让调用方只依赖接口,不依赖具体实现类。
2. 优点
调用端更稳定、扩展新产品更容易、创建逻辑集中管理。
3. 代价
类数量增多,抽象层过多时理解成本上升。
三、示例代码
class SmsSender {
send(msg) {
console.log(`[sms] ${msg}`)
}
}
class EmailSender {
send(msg) {
console.log(`[email] ${msg}`)
}
}
class SenderFactory {
static create(type) {
if (type === 'sms') return new SmsSender()
if (type === 'email') return new EmailSender()
throw new Error(`Unsupported type: ${type}`)
}
}
const sender = SenderFactory.create('email')
sender.send('面试通知已发送')
四、常用应用场景
1. UI 组件按平台创建
同一业务组件在 PC/移动端用不同实现。
2. 支付方式创建
按渠道创建微信、支付宝、银行卡支付实例。
3. 日志/通知通道创建
按配置动态创建 console/http/sentry 等上报器。
五、高频追问标准答法(Q/A)
1. Q: 简单工厂和工厂方法最大的区别
A: 简单工厂用一个类通过参数分发,新增产品常要改原工厂;工厂方法是一类产品对应一类工厂,扩展更符合开闭原则。
2. Q: 工厂模式是不是会导致类爆炸
A: 会增加类数量,但换来更清晰的职责边界。复杂业务里这是可接受的工程成本。
3. Q: 什么时候不建议用工厂
A: 对象创建极简单且几乎无扩展时,用工厂可能过度设计。