《JS设计模式》笔记-抽象工厂模式

抽象工厂模式:通过对类的工厂抽象是其业务用于对产品类簇的创建,而不负责创建某一类产品的实例

通俗说,不是用来创建实例的,是一种声明但不能使用的类。

它的特点是:因为定义了一种类,并定义了该类所必备的方法,如果子类中没有重写这些方法,那么当调用时能找到这些方法便会报错。

    var Car = function () {}
    Car.prototype = {
      getPrice: function () {
        return new Error('抽象方法不能调用')
      },
      getSpeed: function () {
        return new Error('抽象方法不能调用')
      }
    }
    var newCar = new Car();
    console.log(newCar.getPrice())  // Error: 抽象方法不能调用
  

抽象工厂模式

首先是对未定义的类,会有“未创建改抽象类”的报错

F.prototype = new VehicleFactory[superType]() 这里用的是实例化VehicleFactory因为我们同时要继承VehicleFactory[superType]原型上的方法和构造函数上的方法。

  var VehicleFactory = function (subType, superType) {
    if (typeof VehicleFactory[superType] === "function") {
      var F = function () {}
      F.prototype = new VehicleFactory[superType]()
      subType.constructor = subType
      subType.prototype = new F()
    } else {
      throw new Error('未创建该抽象类')
    }
  }
  VehicleFactory.Car = function () {
    this.type = 'car'
  }
  VehicleFactory.Car.prototype = {
    getPrice: function () {
      return new Error('抽象方法不能调用')
    },
    getSpeed: function () {
      return new Error('抽象方法不能调用')
    }
  }
  VehicleFactory.Bus = function () {
    this.type = 'bus'
  }
  VehicleFactory.Bus.prototype = {
    getPrice: function () {
      return new Error('抽象方法不能调用')
    },
    getSpeed: function () {
      return new Error('抽象方法不能调用')
    }
  }

  var BMW = function (price, speed) {
    this.price = price
    this.speed = speed
  }
  VehicleFactory(BMW, 'Car');
  BMW.prototype.getPrice =  function () {
    return this.price
  }

  var Car = new BMW(500000, 1000);
  console.log(Car.getPrice());    // 500000
  console.log(Car.type);      // car
  console.log(Car.getSpeed());    // Error: 抽象方法不能调用
  

简单讲,就是VehicleFactory中定义了一部分会用到的方法,并设置为报错。其他方法以此未构造函数创建类时,需要设置真实 场景的方法替换掉该方法,否则调用的时候就会报预置的错误信息。

随机浏览