实现简单工厂(一)

CommonUtil.js

/**
 * @author Fan
 */

/**
 * 命名空间
 */

 var Fan = {};

 //接口类
Fan.Interface = function(name,method){
   //判断接口的个数
   if(arguments.length != 2){
     throw new Error('接口参数必须是2个');
   }

   this.name = name;

   //创建一个空数组,存放method里的方法
   this.method = [];
   for(var i=0, len = method.length; i<len; i++){
     if(typeof method[i] !== 'string'){
       throw new Error('必须是字符串');
     }
     this.method.push(method[i]);
   }
 }

 //校验接口的方法
 Fan.Interface.ensureImplements = function(object){
   if(arguments.length < 2){
     throw new Error('参数不能小于2个');
   }

   //获得接口实例对象
   for(var i=1, len = arguments.length; i<len; i++){
     var instanceInterface = arguments[i];
     //判断参数是接口类型
     if(instanceInterface.constructor !== Fan.Interface){
       throw new Error('必须是接口类型');
     }

     //循环接口里的每一个方法
     for(var j=0; j< instanceInterface.method.length; j++){
       //用一个临时变量,接受每一个方法的名字(注意是字符串)
       var methodName = instanceInterface.method[j];
       //Object[key]就是方法
       if(!object[methodName] || typeof object[methodName] !== 'function'){
         throw new Error('错误类型');
       }
     }
   }
 };

 //继承方法
 //参数1:子类
 //参数2:父类
Fan.extend = function(sub,sup){
   //实现只继承父类原型对象
   var F = new Function();  //创建一个空函数,进行中转
   F.prototype = sup.prototype; //实现空函数的原型对象,和父类原型对象的转换
   sub.prototype = new F(); //子类原型对象继承
   sub.prototype.constructor = sub; //还原子类的构造器

   //保存一下父类原型对象,一方面方便解耦,另一方面获得父类的原型对象
   sub.superClass = sup.prototype;

   //判断父类原型构造器
   if(sup.prototype.constructor == Object.prototype.constructor){
     sup.prototype.constructor = sup;
   }
 }

index.js

//创建一个工厂的环境

      //卖车的商店

      function CarShop(){};

      CarShop.prototype = {
        constructor : CarShop,  //还原构造器
        sellCar : function(type){
          var car;
          switch (type) {
            case 'Benz':
              car = new Benz();
              break;

            case 'Bmw':
              car = new Bmw();
              break;

            case 'Audi':
              car = new Audi();
              break;

              default : 'not buy it';
          }
          //验证接口
          Fan.Interface.ensureImplements(car , CarInterface);
          return car;
        }
      }

      //通过接口类,实例化一个接口对象
      var CarInterface = new Fan.Interface('CarInterface',['start','run']);

      //车类,宝马,奔驰,奥迪
      function Benz(){};
      Benz.prototype.start = function(){
        console.log('Benz...start');
      };
      Benz.prototype.run = function(){
        console.log('Benz...run');
      };

      function Bmw(){};
      Bmw.prototype.start = function(){
        console.log('Bmw...start');
      };
      Bmw.prototype.run = function(){
        console.log('Bmw...run');
      };

      function Audi(){};
      Audi.prototype.start = function(){
        console.log('Audi...start');
      };
      Audi.prototype.run = function(){
        console.log('Audi...run');
      };

      var shop = new CarShop();
      var car = shop.sellCar('Benz');
      car.start();
      car.run();


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值