根据不同的输入返回不同的实例,一般用来创建同一类对象。例如去饭店(工厂)点菜(实例)
解决问题:
- 将对象的创建和实现分离
优点:
- 结构清晰
- 扩展性好:符合开放-封闭原则
- 解耦:符合最少知识
缺点:
- 额外的系统复杂度
使用场景
- 对象的创建比较复杂时
- 处理同类对象时
工厂模式与模板方法模式的区别:
- 工厂模式:主要关注产品实例的创建,对创建流程封闭起来
- 模板方法模式:主要专注的是为固定的算法骨架提供某些步骤的实现
/* 工厂类 */
class Factory {
static getInstance(type) {
switch (type) {
case 'Product1':
return new Product1()
case 'Product2':
return new Product2()
default:
throw new Error('当前没有这个产品')
}
}
}
/* 产品类1 */
class Product1 {
constructor() { this.type = 'Product1' }
operate() { console.log(this.type) }
}
/* 产品类2 */
class Product2 {
constructor() { this.type = 'Product2' }
operate() { console.log(this.type) }
}
const prod1 = Factory.getInstance('Product1')
prod1.operate() // 输出: Product1
const prod2 = Factory.getInstance('Product3') // 输出: Error 当前没有这个产品