JavaScript 抽象工厂模式实现与原理详解
本文深入解析 JavaScript 中抽象工厂模式的实现机制。针对 JS 缺乏原生抽象类的特性,文章展示了如何通过抛出错误模拟抽象方法,并详细阐述了利用构造函数和原型链构建产品类簇的具体代码。通过实例说明如何创建特定类别的对象,并利用 instanceof 进行类型检查,帮助开发者理解该模式在面向对象编程中的应用。
JavaScript 抽象工厂模式概述
本文整理了作者在学习过程中遇到的关键问题,并提供了相应的代码实例,最后对 JavaScript 抽象工厂模式的核心要点进行了总结。
抽象工厂模式(Abstract Factory)的核心在于通过类的抽象层,使业务逻辑能够适用于某一特定产品类簇的创建过程,而不直接负责单一具体产品的实例化细节。
在 JavaScript 中并不存在直接的抽象类概念,尽管 abstract 是保留字,但并未被实现。因此,我们需要在类的方法中手动抛出错误来模拟抽象类的行为:如果继承的子类未重写该方法而直接调用,系统将抛出错误,从而强制子类实现具体逻辑。
模拟抽象类的机制
const Car = function() { }
Car.prototype.getPrice = function() {return new Error('抽象方法不能调用')}
具体实现方案
在面向对象语言中,抽象工厂模式通常先声明一个抽象类作为父类,用以概括某类产品所需的特征。继承该父类的子类必须实现父类中声明的方法,从而具备父类所定义的功能。
抽象工厂的具体实现代码
/**
* 实现subType类对工厂类中的superType类型的抽象类的继承
* @param subType 要继承的类
* @param superType 工厂类中的抽象类type
*/
const VehicleFactory = function(subType, superType) {
if (typeof VehicleFactory[superType] === 'function') {
function F() {
this.type = '车辆'
}
F.prototype = new VehicleFactory[superType]()
subType.constructor = subType
subType.prototype = new F() // 因为子类subType不仅需要继承superType对应的类的原型方法,还要继承其对象属性
} else throw new Error('不存在该抽象类')
}
VehicleFactory.Car = function() {
this.type = 'car'
}
VehicleFactory.Car.prototype = {
getPrice: function() {
return new Error('抽象方法不可使用')
},
getSpeed: function() {
return new Error('抽象方法不可使用')
}
}
const BMW = function(price, speed) {
this.price = price
this.speed = speed
}
VehicleFactory(BMW, 'Car') // 继承Car抽象类
BMW.prototype.getPrice = function() { // 覆写getPrice方法
console.log(`BWM price is ${this.price}`)
}
BMW.prototype.getSpeed = function() {
console.log(`BWM speed is ${this.speed}`)
}
const baomai5 = new BMW(30, 99)
baomai5.getPrice() // BWM price is 30
baomai5 instanceof VehicleFactory.Car // true
核心总结
模式应用与类型检查总结
通过抽象工厂,我们可以创建属于某个类簇的产品,并利用 instanceof 操作符检查产品的具体类别。同时,这些产品也具备该类簇所必需的方法接口,确保了对象行为的一致性。
JS动态构建复杂嵌套JSON对象的方法
2026-11-05 15:41:52
JS负数取余为什么是负数?详解余数与模运算区别
2026-11-05 13:34:41
JS 解压出现乱码或报错怎么解决?
2026-11-05 12:32:38
JS 中 startsWith、indexOf 与正则判断字符串前缀的对比
2026-11-04 22:19:43
JS解析Excel后怎么将数据转换为JSON格式
2026-11-04 20:58:28
