JavaScript设计模式(一)——简单工厂模式

179 阅读3分钟

「这是我参与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个字母或数字哦")