前端设计模式-抽象工厂模式

68 阅读1分钟

抽象类

JavaScript可以在类的方法中手动地抛出错误来模拟抽象类。

    let car=function(){};
    car.prototype={
        getPrice:function(){
            return new Error("抽象方法不能调用");
        },
        getSpeed:function(){
            return new Error("抽象方法不能调用");
        }
    }

抽象工厂模式

抽象工厂模式在JavaScript中一般用它作为父类来创建一些子类。

 // 抽象工厂方法
 let VehicleFactory=function(subType,superType){
     // 判断抽象工厂中是否有该抽象类
     if(typeof VehicleFactory[superType] === "function"){
        // 缓存类
        function F(){};
        // 继承父类属性和方法
        F.prototype=new VehicleFactory[superType]();
        // 将子类constructor指向子类
        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('抽象方法不能调用');
 },
 getTrainload:function(){
  return new Error('抽象方法不能调用');
 }
}

抽象与实现

 // 宝马汽车子类
 var BMW = function(price, speed){
  this.price = price;
  this.speed = speed;
 }
 // 抽象工厂实现对car抽象类的继承
 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;
 }
 // 抽象工厂实现对car抽象类的继承
 VehicleFactory(Lamborghini, 'car');
 Lamborghini.prototype.getPrice = function(){
  return this.price;
 }
 Lamborghini.prototype.getspeed = function(){
  return this.speed;
 }
 // 宇通汽车子类
 var YUToNG = function(price, passenger){
  this.price = price;
  this.passenger = passenger;
 }
 // 抽象工厂实现对Bus抽象类的继承
 VehicleFactory(YUToNG, 'Bus');
 YUToNG.prototype.getPrice = function(){
  return this.price;
 }
 YUToNG.prototype.getPassengerNum = function(){
  return this.passenger;
 }
 // 奔驰汽车子类
 var BenzTruck = function(price, trainLoad){
  this.price = price;
  this.trainLoad = trainLoad;
 }
 // 抽象工厂实现对Truck抽象类的继承
 VehicleFactory(BenzTruck, 'Truck')
 BenzTruck.prototype.getPrice = function(){
  return this.price;
 }
 BenzTruck.prototype.getTrainload = function(){
  return this.price;
 }