javascript工厂模式

1.简单工厂模式

/**
 * 工厂不是利用另外一个类来初始对象,
 * 而是使用一个子类按照相应的定义来完成类初始化任务
 * 
 * 定义:
 * 工厂是一个把成员变量初始话的任务交给子类中进行的类
 */
(function(){
	var Pet = new Interface("Dog",["eat","register","run","sing"]);
	function BasePet(){//宠物基础类
		this.register = function(){
			document.write("宠物登记...<br>")
		}
		this.eat = function(){
			document.write("吃吨饱饭...<br>")
		}		
	}
	//实现
	function Dog(){
		Dog.superclass.constructor.call(this)
		this.run = function(){
			document.write("小狗跑步...<br>")
		}
		this.sing = function(){
			document.write("小狗唱歌...<br>")
		}		
	}
	function Pig(){
		Pig.superclass.constructor.call(this)
		this.run = function(){
			document.write("小猪跑步...<br>")
		}
		this.sing = function(){
			document.write("小猪唱歌...<br>")
		}		
	}
	function Cat(){
		Cat.superclass.constructor.call(this)
		this.run = function(){
			document.write("小猫跑步...<br>")
		}
		this.sing = function(){
			document.write("小猫唱歌...<br>")
		}		
	}
	function Bird(){
		Bird.superclass.constructor.call(this)
		this.run = function(){
			document.write("小鸟跑步...<br>")
		}
		this.sing = function(){
			document.write("小鸟唱歌...<br>")
		}		
	}
	//继承
	extend(Dog,BasePet);
	extend(Pig,BasePet);
	extend(Cat,BasePet);
	extend(Bird,BasePet);
	//静态工厂
	var PetFactory = {
	  sellPetShop: function(kind) {
	    var pet;
	    /**
	     * kind 种类
	     */
	    switch(kind) {
	      case 'dog':
	        pet = new Dog();
	        break;
	      case 'cat':
	        pet = new Cat();
	        break;
	      case 'pig':
	        pet = new Pig();
	        break;	      
	      default:
	      	//鸟
	        pet = new Bird();
	    }
	    Interface.ensureImplements(pet, Pet);//验证接口关系,在工厂中验证
	    return pet;
	  }
	};	
	//1.把核心商店类编程抽象类
	var PetShop = function(){};//宠物商店
	PetShop.prototype = {
	  //利用工厂改造
	  sellPetShop: function(kind) {
	  	 var pet = this.sellPetShop(kind)//调用本类方法
	     pet.eat();//吃顿饱饭
	     pet.register();//宠物登记
	     return pet;	  	 
	  },
	  //本类不能实例化
	  sellPetShop: function(model) {
	    throw new Error('this is a abstract class.');
	  }	  
	};	
	//2.利用子类来满足需求的扩展
	var OnePetShop = function() {};
	extend(OnePetShop, PetShop);
	//复写父类方法
	OnePetShop.prototype.sellPetShop = function(kind) {
	   var pet;
	    switch(kind) {
	      case 'dog':
	        pet = new Dog();
	        break;
	      case 'cat':
	        pet = new Cat();
	        break;	      
	      default:
	        pet = new Bird();
	    }
	    Interface.ensureImplements(pet, Pet);//验证接口关系,在工厂中验证
	    pet.eat();//吃顿饱饭
	    pet.register();//宠物登记	    
	    return pet;
	};
	//再开一个店
	var twoPetShop = function() {};
	extend(twoPetShop, PetShop);
	//复写父类方法
	twoPetShop.prototype.sellPetShop = function(kind) {
	   var pet;
	    switch(kind) {
	      case 'pig':
	        pet = new Cat();
	        break;	      
	      default:
	        pet = new Bird();
	    }
	    Interface.ensureImplements(pet, Pet);//验证接口关系,在工厂中验证
	    pet.eat();//吃顿饱饭
	    pet.register();//宠物登记	    
	    return pet;
	};
	//试验
	var jim = new OnePetShop();
	jim.sellPetShop("dog");
})()


2.智能工厂

/**
 * 真正意义的工厂是使用一个子类按照相应的定义来完成类初始化任务
 * 定义:
 * 工厂是一个把成员变量初始话的任务交给子类中进行的类
 */
(function(){
	var Pet = new Interface("Dog",["eat","register","run","sing"]);
	function BasePet(){//宠物基础类
		this.register = function(){
			document.write("宠物登记...<br>")
		}
		this.eat = function(){
			document.write("吃吨饱饭...<br>")
		}		
	}
	//实现
	function Dog(){
		Dog.superclass.constructor.call(this)
		this.run = function(){
			document.write("小狗跑步...<br>")
		}
		this.sing = function(){
			document.write("小狗唱歌...<br>")
		}		
	}
	function Pig(){
		Pig.superclass.constructor.call(this)
		this.run = function(){
			document.write("小猪跑步...<br>")
		}
		this.sing = function(){
			document.write("小猪唱歌...<br>")
		}		
	}
	function Cat(){
		Cat.superclass.constructor.call(this)
		this.run = function(){
			document.write("小猫跑步...<br>")
		}
		this.sing = function(){
			document.write("小猫唱歌...<br>")
		}		
	}
	function Bird(){
		Bird.superclass.constructor.call(this)
		this.run = function(){
			document.write("小鸟跑步...<br>")
		}
		this.sing = function(){
			document.write("小鸟唱歌...<br>")
		}		
	}
	//继承
	extend(Dog,BasePet);
	extend(Pig,BasePet);
	extend(Cat,BasePet);
	extend(Bird,BasePet);
	//智能工厂工厂
	var PetFactory = {
	  sellPetShop: function(kind) {
	    var pet;
	    pet = eval("new "+kind+"()")
	    Interface.ensureImplements(pet, Pet);//验证接口关系,在工厂中验证
	    return pet;
	  }
	};	
	//1.把核心商店类编程抽象类
	var PetShop = function(){};//宠物商店
	PetShop.prototype = {
	  //利用工厂改造
	  sellPetShop: function(kind) {
	  	 var pet = this.sellPetShop(kind)//调用本类方法
	     pet.eat();//吃顿饱饭
	     pet.register();//宠物登记
	     return pet;	  	 
	  },
	  //本类不能实例化
	  sellPetShop: function(model) {
	    throw new Error('this is a abstract class.');
	  }	  
	};	
	//2.利用子类来满足需求的扩展
	var OnePetShop = function() {};
	extend(OnePetShop, PetShop);
	//复写父类方法
	OnePetShop.prototype.sellPetShop = function(kind) {
	   	var pet = null;
	   	var pets = ["Dog","Cat","Bird"]
	   	for(v in pets){
	   		if(pets[v] == kind){
			    pet = PetFactory.sellPetShop(kind);
			    Interface.ensureImplements(pet, Pet);//验证接口关系,在工厂中验证
			    pet.eat();//吃顿饱饭
			    pet.register();//宠物登记		   			
	   			break;
	   		}
	   	}
	    return pet;
	};
	//再开一个店
	var twoPetShop = function() {};
	extend(twoPetShop, PetShop);
	//复写父类方法
	twoPetShop.prototype.sellPetShop = function(kind) {
	   	var pet = null;
	   	var pets = ["Pig"]
	   	for(v in pets){
	   		if(pets[v] == kind){
			    pet = PetFactory.sellPetShop(kind);
			    Interface.ensureImplements(pet, Pet);//验证接口关系,在工厂中验证
			    pet.eat();//吃顿饱饭
			    pet.register();//宠物登记		   			
	   			break;
	   		}
	   	}
	    return pet;
	};
	//试验
	var jim = new OnePetShop();
	jim.sellPetShop("Dog");
	jim.sellPetShop("Pig");
})()


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jackletter

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值