我理解的设计模式是为了提高代码复用,增强扩展性的代码编写理念,所以无关乎编程语言。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设计模式》