JavaScript设计模式2——工厂方法模式

180 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第13天,点击查看活动详情

前言

有段时间没写设计模式了,今天我们再来聊聊JavaScript第二钟设计模式——工厂方法模式。

什么是工厂方法模式

工厂方法模式(FACTORY METHOD)是一种常用的类创建型设计模式,此模式的核心精神是封装类中变化的部分,提取其中个性化善变的部分为独立类,通过依赖注入以达到解耦、复用和方便后期维护拓展的目的。它的核心结构有四个角色,分别是抽象工厂;具体工厂;抽象产品;具体产品。——百度百科

简单讲,工厂方法模式就是一个实例化对象的工厂类。还是不懂?那来点实际应用场景吧。

场景

大家经常浏览页面都会发现一个现象,在页面的固定位总是会展示不同的广告。如果采用简单工厂模式我们就会发现一个问题,每来一个新的广告商我们不仅仅要添加类,还要修改工厂函数,得不偿失。

demo

let Class1 = function(data){
    //广告商1
}
let Class2 = function(data){
    //广告商2
}
let Class3 = function(data){
    //广告商3
}
function Advertising(type, data){
    switch(type){
        case 'class1':
            return new Class1(data)
        case 'class2':
            return new Class2(data)
        case 'class3':
            return new Class3(data)
    }
}

使用工厂方法模式

let Advertising(type,data){
    // 判断当前对象的this是否指向Advertising,如果不指向则说明不是通过new调用的。需要手动调用一次
    if(!(this instanceof Advertising)){
        return new Advertising(type,data)
    }
    else{
        return new this[type](data)
    }
}

写到这,我们发现还是没有解决我们的问题,那么多广告商应该放在哪?答案是原型。

Advertising.prototype = {
    Class1: function(data){
        //广告商1
    },
    Class2: function(data){
        //广告商2
    },
    Class3: function(data){
        //广告商3
    }
}

至此,我们的需求就解决了。以后来新的广告商至于要在原型上添加就行了。

总结

通过工厂方法模式,我们实现了使用者与对象类之间的解耦,这也是它的魅力所在。后续人员不必关心如何去创建,只需要调用工厂方法即可。