「这是我参与2022首次更文挑战的第1天,活动详情查看:2022首次更文挑战」。
各位小伙伴大家好,好久不见啦,2022让我们一起争当卷王!恰逢2022首次更文活动,正好把JavaScript的设计模式都给过一遍。大家一起卷起来吧!(温馨提示,设计模式需要有一点的面向对象基础哦。)
简单工厂模式
简单工厂模式:又称为静态工厂方法,由一个工厂对象决定创建某一种产品对象类的实例。主要用来创建同一类的对象。
让我们从实际需求出发理解简单工厂模式:第一个需求是登录模块校验用户的账号不能多于10个字母或者数字。
如果你刚学完面向对象,那么你可能首先就会想到先来简简单单搞一个弹窗的类:
var LoginAlert = function(text){
this.content = text;
}
LoginAlert.prototype.show = function{
//弹窗告诉用户校验信息
}
var userNameAlert = new LoginAlert("用户名不可以超过10个字母或数字哦");
userNameAlert.show();
于是你满心欢喜的展示了功能,结果马上又来了第二个需求,要求输错密码时,也弹窗告诉用户。你心想,嗨呀,这不是手到擒来?屁颠屁颠跑去写出以下代码
var passwordAlert = new LoginAlert("输入的密码不正确,请核对后重新输入")
passwordAlert.show();
但是你还没来得及去展示功能,下个需求又来了:要求用户名不存在时,也提示用户,并且还得在弹窗里加一个注册按钮。这可咋整呢?之前的代码可没有按钮可以复用啊。只能重新写个类了。
var LoginConfirm = function(text){
this.content = text;
}
LoginConfirm.prototype.show = function{
//弹出一个有按钮的窗口
}
var loginFailConfirm = new LoginConfirm("您的用户名不存在,请重新输入或点击下方按钮注册");
loginFailConfirm.show();
刚整完这个提示,又来需求了:要求在登录成功后给出一个提示框,除了有确定和取消按钮外,还可以输入用户的签名。之前的又不能复用了,又得写个新类了。。。
var LoginSign = function(text){
this.content = text;
}
LoginSign.prototype.show = function(){
//显示可以输入签名的弹窗
}
忙完这个需求,你终于下班了。结果第二天上班的时候,老板让别人做注册模块,想复用你的代码,于是你把LoginAlert、LoginConfirm、LoginSign这三个类告诉了别人。结果别人直接无语了,然后说怎么这么多,还都是Login开头的,这样吧,你整个简单工厂给我吧。 结果你懵逼了,什么是简单工厂???赶紧查了一下,原来简单工厂实际上就是一个函数,将登陆模块的类封装到简单工厂函数里,这样注册模块只需要记住这个函数就可以创建想要的对象,而不需要记住一开始的三个类,而且不仅仅是注册模块,其他的模块也可以复用这块的代码。并且大家都不用去关注这些对象到底是依赖于哪个基类,只需要知道这个工厂函数就行了。
于是你将自己的三个类改写成一个简单工厂:
function createPop(type, text){
//创建一个对象并对其扩展属性和方法
var o = new Object();
o.content = text;
o.show = function(){
//弹窗方法
}
if(type == "alert"){
//登录校验弹窗差异部分
}
if(type == "sign"){
//输入签名弹窗差异部分
}
if(type == "confirm"){
//确认注册弹窗差异部分
}
//返回该对象
return o;
}
//创建登录校验弹窗
var userNameAlert = createPop("alert", "用户名不可以超过10个字母或数字哦")