javascriptWEB前端开发

抽象工厂模式-JavaScript设计模式学习笔记

2017-11-22  本文已影响0人  dravenxiaokai

释义描述

抽象工厂其实是一个实现子类继承父类的方法,在这个方法中我们需要通过传递子类以及继承父类(抽象类)的名称,并且在抽象方法中又增加一次对抽象类存在性的一次判断,如果存在,则将子类继承父类的方法。
然后子类通过寄生式继承。继承父类需注意,在对过渡类的原型继承时,我们不是继承父类的原型,而是通过new关键字复制的父类的一个实例,这么做是因为过渡类不应仅仅继承父类的原型方法,还要继承父类的对象属性,所以要通过new关键字将父类的构造函数执行一遍来复制构造函数中的属性和方法。

JavaScript实现

/**
 * 抽象工厂方法
 * @param {*} subType 子类
 * @param {*} superType 父类类型
 * @author dravenxiaokai
 */
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.Bus = function () {
    this.type = 'bus';
}
VehicleFactory.Bus.prototype = {
    getPrice: function () {
        return new Error('抽象方法不能调用');
    },
    getPassengerNum: 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 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.getTrainload;
}

//单例测试
var car = new BMW(1500000, 200);
console.log(car.getPrice());//1500000
console.log(car.type);//car
var bus = new YUTONG(800000, 200);
console.log(bus.getPrice());//800000
console.log(bus.type);//bus
var truck = new BenzTruck(1000000, 1000);
console.log(truck.getPrice());//1000000
console.log(truck.type);//truck

Github源码下载

dravenxiaokai/design-patterns

上一篇 下一篇

猜你喜欢

热点阅读