javascript设计模式学习:创建型设计模式(一)
简单工厂模式(静态工厂方法)
在定义了待实例化的类之后,定义一个方法作为工厂,给它传入需要的类型便可得到该类型的实例。
//篮球基类
function Basketball(){
this.name="篮球";
}
Basketball.prototype.getName=function(){
alert(this.name);
};
//足球基类
function Football(){
this.name="足球";
}
Football.prototype.getName=function(){
alert(this.name);
};
//网球基类
function Tennis(){
this.name="网球";
}
Tennis.prototype.getName=function(){
alert(this.name);
};
//运动工厂
function Factory(name){
switch(name){
case "basketball":
return new BasketBall();
case "football":
return new FootBall();
case "tennis":
return new Tennis();
}
}
优点:使用时只要记住工厂类就可以创建各种类型的对象。
缺点:扩展不方便,当需要增加类型时,需要修改2处。
工厂方法模式
将工厂看作对象,将待实例化的类定义在工厂构造函数的原型对象中。
增加类时只需要在工厂的原型中修改即可。
function Factory(type,content){
if(this instanceof Factory){
var s=new this[type](content);
return s;
}else{
return new Factory//安全模式
}
}
//在工厂原型对象中定义所有待实例化的类型
Factory.prototype={
Basketball:function(content){
},
Football:function(content){
},
Tennis:function(content){
}
}
抽象工厂模式
定义一个抽象工厂方法VehicleFactory,此方法的作用是给2个类之间建立继承关系。对抽象工厂添加抽象类,使用点语法添加。抽象类用来定义它的子类应该有的属性和方法。
function VehicleFactory(){subType,superType}{
if(typeof VehicleFactory[superType]==="function"){
function F(){};
F.prototype=new VehicleFactory[superType]();
subType.constructor=subType;
subType.prototype=new F();
}else{
throw new Error("没有该抽象类");
}
}
VehicleFactory.Ball=function(){
this.type="ball";
};
VehicleFactory.Ball.prototype={
getName:function(){
throw new Error("抽象方法不能调用");
},
getPrice:function(){
throw new Error("抽象方法不能调用");
}
};
使用方式如下:
//篮球
function Basketball(){
this.name="篮球";
}
VehicleFactory(Basketball,"Ball");//建立继承关系
//实现抽象类中的方法
Basketball.prototype.getName=function(){
alert(this.name);
};
Basketball.prototype.getPrice=function(){
//do something
};
//足球基类
function Football(){
this.name="足球";
}
VehicleFactory(Football,"Ball");//建立继承关系
//实现抽象类中的方法
Football.prototype.getName=function(){
alert(this.name);
};
Football.prototype.getPrice=function(){
//do something
};
//网球基类
function Tennis(){
this.name="网球";
}
VehicleFactory(Tennis,"Ball");//建立继承关系
//实现抽象类中的方法
Tennis.prototype.getName=function(){
alert(this.name);
};
Tennis.prototype.getPrice=function(){
//do something
};
疑惑:
- constructor有什么作用,修正它用意何在?
- 抽象工厂使用起来很麻烦,有何优点?