javascript设计模式-抽象工厂模式

目的:对子类实现进行规范,防止因子类没实现调用了父类的方法,所以当调用父类方法时,抛出异常

   // 抽象工厂模式
   var VehicleFactory = function (subType, superType) {
     // 判断抽象工厂中是否有该抽象类
     if (typeof VehicleFactory[superType] === 'function') {
       // 缓存类
       // 方法一:使用Object.create创建,但是会无法继承夫类的属性,读取bmw.type时,会出现undefined
       //subType.prototype = Object.create(VehicleFactory[superType].prototype)
       // 方法二:使用new关键字创建
       subType.prototype = new VehicleFactory[superType]()
       // 方法三:分别继父类原型和子类构造器
       // function F(){}
       // 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('抽象方法不能调用')
     }
   }
   // 货车抽象类
   VehicleFactory.Truck = function () {
     this.type = 'Truck'
   }
   VehicleFactory.Truck.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
   }
   BMW.prototype.getSpeed = function () {
     return this.speed
   }

   // 兰博基尼
   var Lamborghini = function(price, speed) {
     this.price = price
     this.speed = speed
   }
   VehicleFactory(Lamborghini, 'Car')
   Lamborghini.prototype.getPrice = function () {
     return this.price
   }
   Lamborghini.prototype.getSpeed = function () {
     return this.speed
   }

   // 宇通汽车子类
   var YUTONG = function(price, speed) {
     this.price = price
     this.speed = speed
   }
   VehicleFactory(YUTONG, 'Bus')
   YUTONG.prototype.getPrice = function () {
     return this.price
   }
   // 子类没有实现父类的方法
   // YUTONG.prototype.getSpeed = function () {
   //   return this.speed
   // }


   var bmw = new BMW(100, '100km')
   var lambo = new Lamborghini(300, '300km')
   var yutong = new YUTONG(500, '200km')
   console.log(bmw.getPrice()) // 100
   console.log(bmw.getSpeed()) //100km
   console.log(bmw.type) // Car
   console.log(lambo.getPrice()) // 300
   console.log(lambo.getSpeed()) // 300km
   console.log(yutong.getPrice()) // 500
   console.log(yutong.getSpeed()) // Error

你可能感兴趣的:(javascript设计模式-抽象工厂模式)