日期:2014-05-16  浏览次数:20367 次

js中采用简单工厂模式

1.简单工厂模式

? 工厂模式就是专门负责将大量有共同接口的类实例化,而且不必事先知道每次是要实例化哪一个类的模式。它定义一个用于创建对象的接口,由子类决定实例化哪一 个类。

先看一个简单的java例子

//自行车接口
public interface Bicycle{
   public void getName();
   public void assemble();
    public void wash();
}
//自行车产品A
public class BicycleA{
    public void getName(){
          System.out.println("--------I  am is Bicycle A--------")
     }
     public void assemble(){
     }
     public void wash(){
    }
}
//自行车产品B
public class BicycleB{
		public void getName(){
				System.out.println("---------I am is Bicycle B----------")
	   }
     public void assemble(){
     }
     public void wash(){
     }
}
//工厂类
public class BicycleCreator{
    public Bicycle createBicycle(type){
         if("A".equals(type)){
             return new BicycleA();
          }else if("B".equals(type)){
             return new BicycleB();
           }else{
                 return null;
              }
     }

     public static void main(args[]){
     	  BicycleCreator creator =new BicycleCreator();
     	  creator.createBicycle("A").getName();
     		creator.createBicycle("B").getName();
     }
}

? 4. 小结工厂模式的适用范围
? 在编码时不能预见需要创建哪一种类的实例。
? 一个类使用它的子类来创建对象。
? 开发人员不希望创建了哪个类的实例以及如何创建实例的信息暴露给外部程序。?

?

下面使用javascript来模拟实现下一个工厂模式

?

// 定义自行车产品A
 var BicycleA=function(){};
 BicycleA.prototype={
  getName:function(){
    alert("I am A bicycle");
    },
    assemble:function(){},
    wash:function(){}
}
  //定义自行车产品B
 var BicycleB=function(){};
 BicycleA.prototype={
  getName:function(){
    alert("I am B bicycle");
    },
    assemble:function(){},
    wash:function(){}
}

//定义工厂
var BicycleFatory={
    createBicycle:function(model){
    var bicycle;
      switch(mode){
        case 'A':
        bicycle=new BicycleA();
        break;
        case 'B':
        bicycle=new BicycleB();
       break;
      }
     return bicycle;
}
}

//调用方法 定义一个自行车专卖店
var BicycleShop=function(){};
BicycleShop.prototype={
         sellBicycle:function(mode){
           var bicycle=BicycleFactory.createBicycle(mode);
           bicycle.assemble();
           bicycle.wash();
           rerturn bicycle;
         }
}

?接口在工厂模式中起着重要的作用,但javascript中没有严格意义上的接口概念,当然可以写个封装类来强行检查类是否实现了必要的方法,在此不进行展示。如果在定义对象时没有确保实现了必要的产品方法,则工厂模式带来的好处就所剩无几了。

?