JavaScript设计模式(三)【抽象工厂】

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>抽象类</title>
</head>
<body>
<script>

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

    //抽象工厂方法
    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 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.trainLoad;
    }

    window.onload = function() {
        var truck = new BenzTruck(10000000, 1000);
        console.log(truck.getPrice());
        console.log(truck.type);
    }
</script>
</body>
</html>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值