<script type="text/javascript">
//上一个是我第一次在博客里写文章,这一次我又来了
//上次是工厂模式的简单形式,这次是工厂模式的抽象版,什么是抽象呢,就不让人看着不好理解,但我尽量用好理解的方式写出来
//这是一个工厂的构造函数,里面有一个属性,属性的值是一个对象,对象里又有三个属性,分别代表了三种交通工具
//好了其实这个也是一个抽象版的工厂构造函数,好比有人跟你吹牛逼说自己要建一个能造三种交通工具的厂子,但是具体怎么造,他不会了;
function Factory(){
this.goods={
Motor:'motor',
Bike:'bike',
Car:'car'
}
}
//在工厂的原型里增加了一个方法,这个是个抽象的方法,就是没有具体的实现怎么去造的;
Factory.prototype={
createP:function(product){
throw new Error("this method should not be called directly");//如果在抽象工厂的实例上调用了这个方法,就会抛出异常
}
}
//说者无意听者有心呀,回去后你就想要实现他
function Factory_one(){
Factory.apply(this,arguments);//于是你偷偷的借用了他的想法
}
Factory_one.prototype=new Factory();//继承了他的方法 这里有面向对象的基础知识,什么对象冒充了,原型链继承了,
Factory_one.prototype={
constructor:Factory_one,//这里要将你的工厂的constructor属性指向你自己工厂的构造函数,其实在上面有个地方咱们漏了一个地方,
createP:function(product){//你要实现他的方法了
var p=null;//首先定义一个空的变量
switch(product){
case this.goods.Motor://这里能看懂吗,想想,Factory.apply(this,arguments);是干什么的,是不是把抽象工厂构造函数里的this.goods这个属性赋给了,Factory_one
p=new Motor_one();//这个类在下面呢
break;
case this.goods.Bike:
p=new Bike_one();//这个类在下面
break;
case this.goods.Car:
p=new Car_one();//这个类在下面
break;
default:
p=new Motor_one();
break;
}
return p;//返回了你要的交通工具的实例
}
}
//这个和上面的那个一样
function Factory_two(){
Factory.apply(this,arguments);
}
Factory_two.prototype=new Factory();
Factory_two.prototype={
constructor:Factory_two,
createP:function(product){
var p=null;
switch(product){
case this.goods.Motor:
p=new Motor_two();
break;
case this.goods.Bike:
p=new Bike_two();
break;
case this.goods.Car:
p=new Car_two();
break;
default:
p=new Motor_two();
break;
}
return p;
}
}
//下面的是一些类了
function Motor_one(){
this.type='motor_one';
this.say=function(){
console.log("我是"+this.type);
}
}
function Motor_two(){
this.type='motor_two';
this.say=function(){
console.log("我是"+this.type);
}
}
function Bike_one(){
this.type='bike_one';
this.say=function(){
console.log("我是"+this.type);
}
}
function Bike_two(){
this.type='Bike_two';
this.say=function(){
console.log("我是"+this.type);
}
}
function Car_one(){
this.type='car_one';
this.say=function(){
console.log("我是"+this.type);
}
}
function Car_two(){
this.type='car_two';
this.say=function(){
console.log("我是"+this.type);
}
}
//首先要获取两个工厂的实例
var factory=new Factory_one();
var factory=new Factory_two();
//调用工厂的createP方法,并传入你想要创建的交通工具,其实这里有一个更好的传参的方法,在抽象的工厂里不是已经定义了这些交通工具的名字了吗
var p_one=factory.createP("motor");
var p_two=factory.createP("motor");
p_one.say();
p_two.say();
</script>