抽象工厂模式: 通过对类的工厂抽象使其业务用于对产品类簇的创建, 而不负责创建某一类产品的实例.
抽象类
定义一个产品簇, 并声明一些必备的方法, 如果子类中没有去重写而直接调用就会抛出错误.
示例
1 2 3 4 5 6 7 8 9
| var car = function (){} car.prototype = { getPrice: function (){ return new Error('抽象方法不能调用') }, getspeed: function (){ return new Error('抽象方法不能调用') } }
|
抽象工厂方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| var VehicleFactory = function (subType, superType) { if (typeof VehicleFactory[superType] == 'function') { function F() {} F.prototype = new VehicleFactory[superType]() subType.constructor = subType subType.prototype = new F() } else { throw new Error('未创建该抽象类') } }
|
小汽车抽象类
1 2 3 4 5 6 7 8 9 10 11
| VehicleFactory.car = function () { this.type = 'car' } VehicleFactory.car.prototype = { getPrice: function () { return new Error('抽象方法不能调用') }, getspeed: function () { return new Error('抽象方法不能调用') }, }
|
公交车抽象类
1 2 3 4 5 6 7 8 9 10 11
| VehicleFactory.Bus = function () { this.type = 'bus' } VehicleFactory.Bus.prototype = { getPrice: function () { return new Error('抽象方法不能调用') }, getspeed: function () { return new Error('抽象方法不能调用') }, }
|
新建子类-具体实现
1 2 3 4 5 6 7 8 9
| var BMW = function (price, speed) { this.price = price this.speed = speed }
VehicleFactory(BMW, 'car') BMW.prototype.getPrice = function () { return this.price }
|
输出测试
1 2 3 4 5 6
| var bmw = new BMW(1, 100) console.log(bmw.getPrice()) console.log(bmw.price) console.log(bmw.speed) console.log(bmw.type) console.log(bmw.getspeed())
|