资讯专栏INFORMATION COLUMN

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

rockswang / 2496人阅读

摘要:抽象类是一种声明但是不能使用的类,当使用时就会报错。但是是灵活的,可以在类的方法中手动地抛出错误来模拟抽象类。

抽象类是一种声明但是不能使用的类,当使用时就会报错。在JavaScript中,abstract还是一个保留字,不能像传统的面向对象语言那样轻松创建。但是JavaScript是灵活的,可以在类的方法中手动地抛出错误来模拟抽象类。如下:

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

创建的car类什么都不能做,创建时没有任何属性,原型的方法也不能使用,但是在继承时很有用。因为父类定义了一些必要的方法,如果子类没有重写这些方法,那么调用时找到这些类就会报错。
当这些必要的方法从父类继承过来而没有具体去重写实现,那么实例化对象便会调用父类的这些方法,如果父类有友好提示,则对于忘记重写子类的错误的避免就会很有帮助。

抽象工厂模式

抽象工厂实际上是一个实现子类继承父类的,在这个方法中需要传递子类以及要继承父类的名称,并且在抽象工厂方法中增加了一次对抽象类存在性的一次判断,如果存在,则将子类继承父类的方法,然后子类通过寄生式继承。
抽象工厂方法

var 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.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;
}
//抽象工厂实现对Car抽象类的继承
VehicleFactory(BMW,"Car");
BMW.prototype.getPrice = function () {
    return this.price;
}
BMW.prototype.getSpeed = function () {
    return this.speed;
}
//奔驰汽车子类
var BenzTruck = function(price,trainLoad){
    this.price = price;
    this.trainLoad = trainLoad;
}
//抽象工厂实现对Truck抽象类的继承
VehicleFactory(BenzTruck,"Truck")
BenzTruck.prototype.getPrice = function () {
    return this.price;
}
BenzTruck.prototype.getTrained = function () {
    return this.trainLoad;
}

通过抽象工厂,就知道每个子类到底是哪一种类别,然后它们也具有了该类所必备的属性和方法了。
测试

//测试
var truck = new BenzTruck(1000,100);
console.log(truck.getPrice());//1000
console.log(truck.type);//Truck
var car = new BMW(10,5);
console.log(car.getPrice());//10
console.log(car.getSpeed());//5

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/98037.html

相关文章

  • JavaScript工厂模式

    摘要:基于工厂角色和产品角色的多态性设计是工厂方法模式的关键。工厂方法模式之所以又被称为多态工厂模式,是因为所有的具体工厂类都具有同一抽象父类。工厂方法模式总结工厂方法模式是简单工厂模式的进一步抽象和推广。 JavaScript工厂模式 首先需要说一下工厂模式。工厂模式根据抽象程度的不同分为三种 简单工厂模式 工厂方法模式 抽象工厂模式 1.简单工厂模式 简单工厂模式:又称为静态工厂方法...

    oujie 评论0 收藏0
  • JavaScript设计模式第一弹-创建型设计模式

    摘要:前言接下来将会为大家介绍设计模式中的创建型设计模式,在此之前需要掌握一定的对象继承基础。但是如果是工厂方法模式的话,则只需要往工厂方法中添加基类则可以。 前言 接下来将会为大家介绍设计模式中的创建型设计模式,在此之前需要掌握一定的JavaScript对象继承基础。 简单工厂模式 先说说 什么是简单工厂模式:又叫静态工厂方法,由一个工厂对象决定创建某一种产品对象类的实例 看着定义有点懵,...

    陈江龙 评论0 收藏0
  • 从ES6重新认识JavaScript设计模式(二): 工厂模式

    摘要:简单工厂模式简单工厂模式又叫静态工厂模式,由一个工厂对象决定创建某一种产品对象类的实例。工厂方法模式工厂方法模式的本意是将实际创建对象的工作推迟到子类中,这样核心类就变成了抽象类。抽象工厂模式一般用在 1 什么是工厂模式? 工厂模式是用来创建对象的一种最常用的设计模式。我们不暴露创建对象的具体逻辑,而是将将逻辑封装在一个函数中,那么这个函数就可以被视为一个工厂。工厂模式根据抽象程度的不...

    Reducto 评论0 收藏0
  • 从ES6重新认识JavaScript设计模式(二): 工厂模式

    摘要:简单工厂模式简单工厂模式又叫静态工厂模式,由一个工厂对象决定创建某一种产品对象类的实例。工厂方法模式工厂方法模式的本意是将实际创建对象的工作推迟到子类中,这样核心类就变成了抽象类。抽象工厂模式一般用在 1 什么是工厂模式? 工厂模式是用来创建对象的一种最常用的设计模式。我们不暴露创建对象的具体逻辑,而是将将逻辑封装在一个函数中,那么这个函数就可以被视为一个工厂。工厂模式根据抽象程度的不...

    szysky 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<