JavaScript 设计模式之工厂模式

 上一篇<<JavaScript 设计模式之单例模式>>谈到单例模式.这节我们谈谈工厂模式

我理解的设计模式是为了提高代码复用,增强扩展性的代码编写理念,所以无关乎编程语言。

一.简单工厂(Sample Factory)

function createPop(type,text){
     var o = new object();
     o.content = text;
     o.show = function(){
            //todo
     };

     if(type == 'alert'){
            //todo
     } else if(type == 'conform'){
            //todo
     } else if(type == 'prompt'){
            //todo
     }
}

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

二.工厂方法(Factory Method)

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

var FoodFactory = function(type,count){
     if(this instanceof FoodFactory){
           return new this[type](count);
     }
}

FoodFactory.prototype = {
     Pie: function(count){
            //todo
     },
     Pizza: function(count){
            //todo
     },
     Cake: function(count){
            //todo
     }
}

三.抽象工厂(Abstract Factory)

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

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

var VehicleFactory = function(subType,superType){  
     if(typeof VehicleFactory[superType] === 'function'){
           fucntion F(){};  //缓存类
           F.prototype = new VehicleFactory[super]();
           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('抽象方法不能调用');
     },
     // ...
}

//抽象类
VehicleFactory.Truck= function(){
     this.type = 'Truck';
};

VehicleFactory.Truck.prototype = {
     getPrice:function(){
           return new Error('抽象方法不能调用');
     },
     // ...
}

//宝马子类
var BMW = function(price,speed){
    this.price = price;
    this.speed = speed;
};
VehicleFactory(BMW,'Car'); //宝马继承了抽象父类Car,有了一些抽象方法,但是不能使用
BMW.prototype.getPrice = function(){
    return this.price;
}

//使用
var z4 = new BMW(50000);
console.log(z4.type);        //Car      继承父类Car的属性
console.log(z4.getPrice());  //50000 继承父类Car的抽象方法,自己重新实现

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

感兴趣可以加我微信,里面很多学习质料

猜你喜欢

转载自my.oschina.net/u/3703858/blog/1629271
今日推荐