0%

工厂模式

简单工厂模式

只提供一个类

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
//蓝球基类
var Basketball=function(){
this.intro="篮球"
}
Basketball.prototype={
getMember:function(){
console.log('每个队伍5名队员')
},
getBallSize:function(){
console.log('蓝球很大')
}
}
//足球基类
var Football=function(){
this.intro='足球'
}
Football.prototype={
getMember:function(){
console.log('每个队伍需要11名队员')
},
getBallSize:function(){
console.log('租足球很大')
}
}
//运动工厂
var SportFactory=function(name){
switch(name){
case 'NBA':
return new Basketball();
case 'wordCup':
return new Football()
}
}
//为世界杯创建一个足球,只需要记住运动工厂,调用并创建
var football=SportFactory('wordCup')
console.log(football)
console.log(football.intro)
football.getMember()

抽象工厂模式

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

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
//抽象工厂方法
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('抽象方法不能调用')
},
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

}
//抽象工厂实现对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
}