抽象工厂模式

一、定义

  抽象工厂模式:通过对类的工厂抽象使其业务用于对产品类簇的创建,而不负责创建某一类产品的实例。

二、抽象工厂模式

  继承抽象类是很有用的,因为定义了一种类,并定义了该类所必要的方法,如果在子类中没有重写这些方法,那么当调用时能找到这些方法,但会报错。这一特点在大型项目中是很有效的,总会有一些子类去继承另一些父类,这些父类经常会定义一些必要的方法,却没有具体实现,子类如果没有重写,父类有友好的提示,这样对于忘记重写子类的这些错误遗漏的避免是很帮助的。

 1 // 抽象工厂方法
 2 var VehicleFactory = function(subType, superType) {
 3     // 判断抽象工厂中是否有该抽象类
 4     if(typeof VehicleFactory[superType] === 'function') {
 5         // 缓存类
 6         function F() {};
 7         // 继承父类属性和方法
 8         F.prototype = new VehicleFactory[superType]();
 9         // 将子类constructor指向子类
10         subType.constructor = subType;
11         // 子类原型继承‘父类’
12         subType.prototype = new F();
13     }else {
14         // 不存在该抽象类抛出错误
15         throw new Error('未创建该抽象类')
16     }
17 }
18 // 小汽车抽象类
19 VehicleFactory.Car = function() {
20     this.type = 'car';
21 };
22 VehicleFactory.Car.prototype = {
23     getPrice: function() {
24         return new Error('抽象方法不能调用');
25     },
26     getSpeed: function() {
27         return new Error('抽象方法不能调用')
28     }
29 };
30 // 公交车抽象类
31 VehicleFactory.Bus = function() {
32     this.type = 'bus';
33 };
34 VehicleFactory.Bus.prototype = {
35     getPrice: function() {
36         return new Error('抽象方法不能调用');
37     },
38     getPassengerNum: function() {
39         new Error('抽象方法不能调用');
40     }
41 }
42 // 货车抽象类
43 VehicleFactory.Truck = function() {
44     this.type = 'truck';
45 }
46 VehicleFactory.Truck.prototype = {
47     getPrice: function() {
48         return new Error('抽象方法不能调用');
49     },
50     getTrainload: function() {
51         new Error('抽象方法不能调用');
52     }
53 }

  抽象工厂其实是一个实现子类继承父类的方法,通过传递子类以及要继承父类(抽象类)的名称,在抽象工厂方法中又增加了一次对抽象类存在性的一次判断,如果存在,则将子类继承父类的方法。子类通过寄生式继承,在继承父类过程中需要注意,在对过渡类的原型继承时,不是继承父类的原型,而是通过new关键字复制的父类的一个实例,这么做事因为过渡类不仅要继承父类的原型方法,还要继承父类的对象属性。

三、抽象与实现

 1 // 宝马汽车子类
 2 var BMW = function(price, speed) {
 3     this.price = price;
 4     this.speed = speed;
 5 }
 6 // 抽象工厂实现对Car抽象类的继承
 7 VehicleFactory(BMW, 'Car');
 8 BMW.prototype.getPrice = function() {
 9     return this.price;
10 }
11 BMW.prototype.getSpeed = function() {
12     return this.speed;
13 }
14 // 兰博基尼汽车子类
15 var Lamborghini = function(price, speed) {
16     this.price = price;
17     this.speed = speed;
18 }
19 // 抽象工厂实现对Car抽象类的继承
20 VehicleFactory(Lamborghini, 'Car');
21 Lamborghini.prototype.getPrice = function() {
22     return this.price;
23 }
24 Lamborghini.prototype.getSpeed = function() {
25     return this.speed;
26 }
27 // 抽象工厂实现对Car抽象类的继承
28 VehicleFactory(Lamborghini, 'Car');
29 Lamborghini.prototype.getPrice = function() {
30     return this.price;
31 };
32 Lamborghini.prototype.getSpeed = function() {
33     return this.speed;
34 };
35 // 宇通汽车子类
36 var YUTONG = function(price, passenger) {
37     this.price = price;
38     this.passenger = passenger;
39 };
40 // 抽象工厂实现时对Bus抽象类的继承
41 VehicleFactory(YUTONG, 'Bus');
42 YUTONG.prototype.getPassengerNum = function() {
43     return this.passenger;
44 };
45 // 奔驰汽车子类
46 var BenzTruck = function(price, trainLoad){
47     this.price = price;
48     this.trainLoad = trainLoad;
49 }
50 // 抽象工厂实现时对Truck抽象类的继承
51 VehicleFactory(BenzTruck, 'Truck');
52 BenzTruck.prototype.getPrice = function() {
53     return this.price;
54 }
55 BenzTruck.prototype.getTrainload = function() {
56     return this.trainLoad
57 }
58 
59 // 测试类
60 var truck = new BenzTruck(1000000, 1000);
61 console.log(truck.getPrice()); // 1000000
62 console.log(truck.type); // truck
63 console.log(truck.trainLoad); // 1000

参考资料:《JavaScript设计模式》

原文地址:https://www.cnblogs.com/daheiylx/p/13839935.html