js设计模式笔记--抽象工厂模式

抽象工厂模式

  1. 抽象类:声明但是不能使用的类
  2. 创造一个通用的大类,通过这个类去创建一系列抽象类,让子类去继承父类定义的但不能使用的方法,子类然后去实现这个抽象的方法
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    ~function (global) {
    'use strict'
    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') {
    // noinspection JSAnnotator
    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
    }

    }(this)