一起养成写作习惯!这是我参与「掘金日新计划 · 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
}
}
至此,我们的需求就解决了。以后来新的广告商至于要在原型上添加就行了。
总结
通过工厂方法模式,我们实现了使用者与对象类之间的解耦,这也是它的魅力所在。后续人员不必关心如何去创建,只需要调用工厂方法即可。