The Factory Pattern
真实的工厂模式与简单工厂模式不同在于不会使用另外一个类或者对象来创建bicycles(就像上面的例子),取而代之是使用一个子类。正式的工厂模式的定义是一个推迟实例化他的成员对象为一个实例的类。让我们使用BicycleShop这个例子来解释简单工厂模式和工厂模式的不同点。
你希望允许每一个bicycle shop 从任何他选择的制造商那里得到他的配件。基于这一点。一个单一的BicycleFactory对象不能够提供所有的bicycle实例,取而代之,你能创建一个作为抽象类的BicycleShop同时让子类实现他们自己的createBicycle方法,使用任何他们选择的制造商的配件。

BicycleShop
1 var BicycleShop=function(){}
2
3 BicycleShop.prototype={
4
5 sellBicycle:function(model){
6
7 var bicycle=this.createBicycle(model);
8
9 bicycle.assemble();
10
11 bicycle.wash();
12
13 return bicycle;
14
15
16
17 },
18
19 createBicycle:function(model){
20
21 throw new Error('Unsupport operator on an abstract class');
22
23 }
24
25 };
26
在这里定义了一个createBicycle的方法,但是他将抛出一个错误如果他被调用。BicycleShop现在是一个抽象类了;他应该不被实例化,只有subclassed.为了创建一个子类使用特别的自行车厂商,扩展BicycleShop同时重写这个方法。这里有两个子类,一个是收到特殊的公司的自行车,另外一个是从一个从普通公司得到的产品

AcmeBicycleShop And generalproductsbicycleshop
1 /*AcmeBicycleShop*/
2
3 var AcmeBicycleShop=function(){
4
5
6
7 };
8
9 extend(AcmeBicycleShop,BicycleShop);
10
11 AcmeBicycleShop.prototype.createBicycle=function(model){
12
13 var bicycle;
14
15 switch(model){
16
17 case 'The Speedster':
18
19 bicycle=new AcmeSpeedster();
20
21 break;
22
23 case 'The Lowrider':
24
25 bicycle=new AcmeLowrider();
26
27 break;
28
29 case 'The Flatlander':
30
31 bicycle=new AcmeFlatlander();
32
33 break;
34
35 case 'The Comfort Cruiser':
36
37 default:
38
39 bicycle=new AcmeComfortCruiser();
40
41 }
42
43 Interface.ensureImplements(bicycle,Bicycle);
44
45 return bicycle;
46
47 }
48
49 //generalproductsbicycleshop class
50
51 var GeneralProductsBicycleShop=function(){
52
53
54
55 }
56
57 extend(GeneralProductsbicycleShop,BicycleShop);
58
59 GeneralProductsBicycleShop.prototype.createBicycle=function(model){
60
61 var bicycle;
62
63 switch(model){
64
65 case 'The Speedster':
66
67 bicycle=new GeneralProductsSpeedster();
68
69 break;
70
71 case 'The Lowrider':
72
73 bicycle=new GeneralProductsLowrider();
74
75 break;
76
77 case 'The Flatlander':
78
79 bicycle=new GeneralProductsFlatlander();
80
81 break;
82
83 case 'The Comfort Cruiser':
84
85 default:
86
87 bicycle=new GeneralProductsComfortCruiser();
88
89 }
90
91 Interface.ensureImplements(bicycle,Bicycle);
92
93 return bicycle;
94
95 }
96
97
所有从这些工厂方法创建的对象都实现了Bicycle的接口,所以任何代码的重写,都别认为是一个新的对象。Selling bicycles还是和以前的方式一样。现在你能创建一个既能卖acme 又能卖General产品的自行车了。
1 Var alecsCruisers=new AcmebicycleShop();
2
3 Var youreNewBike=aleceCruisers.sellBicycle(‘The Lowrider’);
4
5 Var BobsCruisers=new GeneralProductsBicycleShop();
6
7 Var yourSecondNewBike=bobsCruisers.sellBicycle(‘The Lowrider’);
8
既然生产商生产出的自行车的零件都是标准件的,消费者可以到一个商店中然后预定一个特定样式的而不需要关注最初的制造者。或者消费者只是希望有一辆Acme牌子的自行车,他们能去这个牌子车的专卖店去买。
添加额外的执照上变的简单,简单的创建一个BicycleShop的子类然后重写createBicycle这个工厂方法。你能同样改变每一个子类使他们可以附加特殊生产商制造的产品。这是工厂模式最重要的特点。你能写出所有通用的Bicycle代码在一个父类中(BicycleShop)然后把特殊代码的实例交给子类。通用的代码聚集在一处。变化的代码封装在子类中。