工厂模式——JavaScript

我理解的设计模式是为了提高代码复用,增强扩展性的代码编写理念,所以无关乎编程语言。JavaSript是我感兴趣的语言,所以使用它来实现。

  • 简单工厂(Sample Factory)

又叫静态工厂,用于创建同一类对象。如弹出框分为警告、确认和对话框,它们公共的方法提取出来,不同之处分别处理。

 1 function createPop(type,text){
 2      var o = new object();
 3      o.content = text;
 4      o.show = function(){
 5             //todo
 6      };
 7 
 8      if(type == 'alert'){
 9             //todo
10      } else if(type == 'conform'){
11             //todo
12      } else if(type == 'prompt'){
13             //todo
14      }
15 }        

创建一个Alert:var nameAlert = new createPop('alert','请输入姓名!');

  • 工厂方法(Factory Method)

工厂方法是将创建对象的方法推迟到子类中。如一个工厂方法可以生产几种食品类。

 1 var FoodFactory = function(type,count){
 2      if(this instanceof FoodFactory){
 3            return new this[type](count);
 4      }
 5 }
 6 
 7 FoodFactory.prototype = {
 8      Pie: function(count){
 9             //todo
10      },
11      Pizza: function(count){
12             //todo
13      },
14      Cake: function(count){
15             //todo
16      }
17 }

 

  •  抽象工厂(Abstract Factory)

抽象类显示定义一些功能,但没有具体实现。子类继承了抽象类还需要实现各个虚方法。就是在其他面向对象语言里的多态,创建子类赋值给父类,好处是调用方式都是一样的,运行时会自动选择子类对应的方法。

如一个汽车的公司有多个品牌,它只负责设计汽车有什么功能,但真正的生产给子公司实现。

 1 var VehicleFactory = function(subType,superType){  
 2      if(typeof VehicleFactory[superType] === 'function'){
 3            fucntion F(){};  //缓存类
 4            F.prototype = new VehicleFactory[super]();
 5            subType.constructor = subType;
 6            subType.prototype = new F(); 
 7      } else {
 8            throw new Error('未创建该抽象类');
 9      }
10 }
11 
12 //抽象类
13 VehicleFactory.Car = function(){
14      this.type = 'Car';
15 };
16 
17 VehicleFactory.Car.prototype = {
18      getPrice:function(){
19            return new Error('抽象方法不能调用');
20      },
21      // ...
22 }
23 
24 //抽象类
25 VehicleFactory.Truck= function(){
26      this.type = 'Truck';
27 };
28 
29 VehicleFactory.Truck.prototype = {
30      getPrice:function(){
31            return new Error('抽象方法不能调用');
32      },
33      // ...
34 }
35 
36 //宝马子类
37 var BMW = function(price,speed){
38     this.price = price;
39     this.speed = speed;
40 };
41 VehicleFactory(BMW,'Car'); //宝马继承了抽象父类Car,有了一些抽象方法,但是不能使用
42 BMW.prototype.getPrice = function(){
43     return this.price;
44 }
45 
46 //使用
47 var z4 = new BMW(50000);
48 console.log(z4.type);        //Car      继承父类Car的属性
49 console.log(z4.getPrice());  //50000 继承父类Car的抽象方法,自己重新实现

抽象工厂做了什么?我们需要一个新的子类时,使用抽象工厂让子类继承对应的一个抽象类,得到一些属性和虚方法,子类再实现这些虚方法,就可以使用了。

参考:

张容铭《JavaScript设计模式》

原文地址:https://www.cnblogs.com/feitan/p/5238137.html