如果希望代码向人一样,能够成长,那么设计模式是必不可少的。今天接触第一个设计模式,属于创建型设计模式——简单工厂设计模式
需求:如果我希望要一个弹框,我的js应该怎么写?
// 如果我需要一个弹框
function Pop(text){
this.content = text;
}
Pop.prototype.show = function(){
//显示弹框
};
// 测试
var pop = new Pop("请输入内容");
pop.show();
上例用对象的方式,创建了一个弹框的对象。那么,如果我需要不通类型的弹框呢,比如:提示框,警告框,确认框。。。该怎么做?
可以创建三个对象,然后用哪个就创建哪个。
// 提示框对象
function AlertPop(text){
this.content = text;
}
AlertPop.prototype.show = function(){
//显示弹框
};
// 警告框
function WarnPop(text){
this.content = text;
}
WarnPop.prototype.show = function(){
//显示弹框
};
// 确认框
function ConfirmPop(text){
this.content = text;
}
ConfirmPop.prototype.show = function(){
//显示弹框
};
// 测试
var ap = new AlertPop("您的内容有误");
var wp = new WarnPop("可能有问题哦");
var cp = new ConfirmPop("您确定吗");
ap.show();
wp.show();
cp.show();
但是如果这样,我们每次使用都要找对应的类,太麻烦了,可不可以统一管理呢?
第一种方式 用工厂管理创建对象
用一个工厂对象将创建实例的动作封装起来,对外只暴露工厂对象
var PopFactory = function(name){
switch (name){
case 'alert':
return new AlertPop("您的内容有误");
case 'warn':
return new WarnPop("可能有问题哦");
case 'confirm':
return new ConfirmPop("您确定吗");
}
}
第二种方式 用工厂管理差异部分
在创建弹框的时候,公共的部分抽取出来,判断管理各自的私有部分
function createPop(type,text){
var o = new Object();
o.content = text;
o.show = function(){
// 显示方法
};
if(type == 'alert'){
// 提示弹框差异部分
}
if(type == 'warn'){
// 警告弹框差异部分
}
if(type == 'confirm'){
// 确认框差异部分
}
return o;
}
var a = createPop('alert','内容有误')
两种方式有一定区别:
1 第一种方式,弹框是实例化对象创建的;第二种 则是 创建一个新对象,然后不断增强属性和方法。
2 第一种方式,如果三个类继承同一个父,那么父的原型方法可以复用;而第二种 就是单独的一个对象
3 第一种方式,扩展更灵活;第二种,如果弹框变化很大,很可能要拆解代码
4 第一种方式实现起来更复杂;第二种相对简单
使用时,根据需求而定。