简单工厂模式
需求: 原生js实现一个登陆验证的提示,当用户输入用户名或者密码不正确时,给出提示
var LoginAlert = function (text) {
this.content = text
}
LoginAlert.prototype.show = function () {
alert(this.content)
}
var userNameAlert = new LoginAlert('用户名不能多于16个字母和数字')
userNameAlert.show()
var pasWordAlert = new LoginAlert('输入密码不正确')
pasWordAlert.show()
新需求: 再加一个注册按钮,同样进行输入框的验证
var RegisterAlert = function (text) {
this.content = text
}
RegisterAlert.prototype.show = function () {
alert(this.content)
}
var RegisterFailedAlert = new RegisterAlert('用户名已存在,请重新输入')
RegisterFailedAlert.show()
新需求: 再添加一个登录成功的提示框
var LoginPrompt = function (text) {
this.content = text
}
LoginPrompt.prototype.show = function () {
alert(this.content)
}
var loginSuccess = new LoginPrompt('登录成功,填写今天的心情吧~~~')
loginSuccess.show()
点评: 这么写已经能够满足于需求,只是比较零散,如果将上述类封装在一个类,复用重复性代码,然后调用一个类,从而实现需求的功能,岂不是好?
var Factory = function (name) {
switch (name) {
case 'alert':
return new LoginAlert();
case 'register':
return new RegisterAlert()
case 'LoginPrompt':
return new LoginPrompt()
}
}
点评:上述代码虽然将多个类封装在一个函数里面,但是存在大量的重复性代码,可以继续优化下
var LoginValid = function (tips) {
this.content = tips
}
LoginValid.prototype.show = function () {
alert(this.content)
}
var FactoryFun = function (type, tips) {
var obj = new Object();
obj.content = tips;
obj.show = function () {
alert(this.content)
}
if (type === 'alert') {
}
if (type === 'register') {
}
if (type === 'LoginPrompt') {
}
return obj
}
var loginInstance = FactoryFun('alert', '用户名输入错误')
loginInstance.show()
点评: 上述代码相对首次书写定义多个类进行验证是不是优雅很多呢? 提供一个工厂函数,根据传入参数判断类型、提示语。 在团队项目开发,我们应该尽可能少的创建全局变量。同一类对象的不同需求,重复性代码可以提取出来,代码复用是面向对象编程的一条准则;