浅析JS抽象工厂模式

 更新时间:2017年12月14日 14:09:30   投稿:laozhang  
本篇文章主要给大家总结了一下作者在学习JS抽象工厂模式时的经验和总结,有兴趣的朋友跟着学习下吧。

以下就是作者学习中遇到的问题以及代码实例,最后还给大家关于JS抽象工厂模式的学习做了总结。

抽象工厂模式(Abstract Factory)就是通过类的抽象使得业务适用于一个产品类簇的创建,而不负责某一类产品的实例。

JS中是没有直接的抽象类的,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获取height和width的方法说明

    js获取height和width的方法说明

    js获取height和width属性的值在日常开发中很常见,于是本人搜集整理了一下,感兴趣的朋友可以参考下
    2013-01-01
  • 超全面的javascript中变量命名规则

    超全面的javascript中变量命名规则

    javascript 有三大经典的变量命名法:匈牙利命名法,驼峰式命名法和帕斯卡命名法。今天主要介绍下这三种命名方式。文中通过示例代码介绍的很详细,有需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-02-02
  • uniapp返回上一页执行上一页方法解决方案

    uniapp返回上一页执行上一页方法解决方案

    这篇文章主要给大家介绍了关于uniapp返回上一页执行上一页方法解决方案,在UniApp中可以通过uni.navigateBack()方法返回上一个页面,文中通过代码示例介绍的非常详细,需要的朋友可以参考下
    2023-08-08
  • JavaScript的面向对象编程基础

    JavaScript的面向对象编程基础

    这篇文章主要介绍了JavaScript的面向对象编程基础,是JavaScript入门学习中的重要知识概念,需要的朋友可以参考下
    2015-08-08
  • 有关javascript的性能优化 (repaint和reflow)

    有关javascript的性能优化 (repaint和reflow)

    本篇文章,小编将为大家介绍,有关javascript的性能优化(repaint和reflow),有需要的朋友可以参考一下
    2013-04-04
  • 详解JavaScript中|单竖杠运算符的使用方法

    详解JavaScript中|单竖杠运算符的使用方法

    JavaScript中|单竖杠通常被用来对浮点型数字进行取证,这里同时也介绍了单竖杠的运算规则,下面我们就来详解JavaScript中|单竖杠的使用方法
    2016-05-05
  • js作用域及作用域链概念理解及使用

    js作用域及作用域链概念理解及使用

    作用域链是由于js的变量都是对象的属性,而该对象可能又是其它对象的属性,而所有的对象都是window对象的属性,所以这些对象的关系可以看作是一条链
    2013-04-04
  • 彻底搞懂 javascript的Promise

    彻底搞懂 javascript的Promise

    这篇文章主要为大家详细介绍了javascript的Promise,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-02-02
  • 简单实现异步编程promise模式

    简单实现异步编程promise模式

    本篇文章主要介绍了异步编程promise模式的简单实现,并对每一步进行了分析,需要的朋友可以参考下
    2015-07-07
  • Javascript中arguments和arguments.callee的区别浅析

    Javascript中arguments和arguments.callee的区别浅析

    这篇文章主要介绍了Javascript中arguments和arguments.callee的区别浅析,本文用一个实例来理解它们的区别,需要的朋友可以参考下
    2015-04-04

最新评论