持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第9天,点击查看活动详情
楔子
为什么要使用设计模式?
日常业务开发过程中,即使开发者不使用任何设计模式,依然可以实现业务功能。既然如此,我们为什么要花费时间来了解设计模式并使用呢?
首先,设计模式可以让我们书写出美观且结构合理的代码;其次,设计模式是一种行之有效的方案,可以帮助我们快速的实现业务,而不是为了实现需求的代码堆砌;最后,设计模式其实也是一种最佳实践,是开发者所追求的理想模式。
单例模式又是什么呢?
单例模式又被称为单体模式,是只允许实例化一次的对象类,并且提供可全局访问点。
大家可能对单例模式没什么概念,但是,日常开发过程中大家可能都使用过单例模式。在ES6之前,JavaScript其实没有类的概念,只是通过命名和函数实现的时候来模拟实现。所以,在JavaScript中,单例模式的最大特点就是“单一”和“全局”。
单例模式的特性
命名空间
单例的最大特性就是创建了一个命名空间,我们可以通过命名空间来访问内部的变量和方法。例如我们之前常用的JQuery库就使用了单例模式。
按照这个特性,我们就可以来实现一个简单版的单例模式了。
function Singleton (name = 'Singleton') {
this.name = name;
this.instance = null;
}
Singleton.prototype.getName = function () {
return this.name;
}
Singleton.prototype.getInstance = function (name) {
if (this.instance) {
return this.instance;
}
return this.instance = new Singleton(name);
}
模块化
单例模式除了创建了一个命名空间之外,还将代码划分为一个个代码块来进行代码管理。在ES6中的module其实也可以理解为一种变相的单例模式。
单例模式实践
标配版单例模式
我们借助闭包的方式来实现单例模式。如果实例已存在的话,直接返回实例;如果实例不存在的话,就先创建实例,然后再返回创建的实例。
const Singleton = (function(){
let instance = null;
return function(name){
if(instance){
return instance
}
return instance = new Singlton(name);
}
})();
这种单例模式是运行时立马执行,即使当前我们并没有使用到这个实例。
高配版惰性单例
为了优化初始化时的开销,我们有时候没必要立马执行单例,可以延迟创建,这时候我们就可以使用惰性单例了。这样的好处就是提高我们的初始化性能,可以让页面更快的渲染出来。
const LazySingleton = function() {
let _instance = null;
return function () {
if (!_instance) {
_instance = new Single();
}
return _instance;
}
}
终章
好了,有关单例模式的实践我们就聊这么多,如果大家有什么想要聊的,可以在下方进行留言交流。