JavaScript 抽象工厂模式实现与原理详解

作者:纸飞机

时间:2026-10-22

浏览:577

本文深入解析 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 操作符检查产品的具体类别。同时,这些产品也具备该类簇所必需的方法接口,确保了对象行为的一致性。

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章