一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第25天,点击查看活动详情。
前言
哈喽,各位看官,时隔几天,我又来写设计模式了。今天我们的主角是单例模式,又被称为单体模式。
单例模式,属于创建类型的一种常用的软件设计模式。通过单例模式的方法创建的类在当前进程中只有一个实例(根据需要,也有可能一个线程中属于单例,如:仅线程上下文内使用同一个实例)——百度百科
顾名思义,单例模式就是只允许实例化一次的对象类。这样说是不是有点熟悉了?那我们再来换种说法:命名空间。现在是不是恍然。
记得还没用框架开发时,每个js文件往外暴露的方法都得包含在对象中,避免命名冲突。这实际上就是单例模式的一种应用。转组件之后,像vuex中,我们可以通过控制namespaced:true来使模块称为命名空间模块。
说了这么多,其实大家应该都懂了,但是还是来个小demo看看吧。
demo
我们在开发中可能经常会碰到这样的代码。
function getData(params) {
// 函数逻辑
}
function getName() {
if(getData(params) === true)
// 函数逻辑
else
// 函数逻辑
}
function getCode() {
if(getName() === true)
// 函数逻辑
else
// 函数逻辑
}
由于名称太大众化,两个开发者同时开发这个界面,等到合并代码时,出现冲突了。保留谁的呢?解决冲突又得耗费多少工作量呢?可以保证解决完冲突不会出现逻辑错误或者造成代码漏洞引起bug呢?种种原因,我们并不是很推荐这样写。
优化:
const getSomething = {
getData(params){
// 函数逻辑
},
getName() {
if(this.getData(params) === true)
// 函数逻辑
else
// 函数逻辑
},
getCode() {
if(this.getName() === true)
// 函数逻辑
else
// 函数逻辑
}
}
这样一来,我们的代码都包含在我们的getSomething类中,两个开发者都有各自的对象来维护,也不会造成命名冲突的情况,大大减少了合并代码造成的bug发生。
总结
大家使用第三方库都会发现这样一个现象,都得使用一些别名或变量来调用方法。例如lodash的_,JQueryde $等,都是为了避免污染全局命名空间。其实单例模式还有很多用途,比如创建静态变量,延迟创建单例等,感兴趣的看官可以自己查阅资料研究。