# 设计模式
作为一个前端新人,学习了设计模式以后,希望能从源头上,用浅显易懂的语言来解释它。当然不一定是正确的,只是我个人对设计模式的一点浅显理解。
# 创建型设计模式
创建型设计模式:故名思意,这些模式都是用来创建实例对象的。
# 单例模式
首先我们需要理解什么是单例。 单:指的是一个。 例:指的是创建的实例。 单例:指的是创建的总是同一个实例。也就是使用类创建的实例始终是相同的。 我们先看下面的一段代码:
class Person{
constructor(){}
}
let p1 = new Person();
let p2 = new Person();
console.log(p1===p2) //false
上面这段代码,定义了一个Person
类,通过这个类创建了两个实例,我们可以看到最终这两个实例是不相等的。也就是说,通过同一个类得到的实例不是同一个(这本就是理所应当),但是如果我们想始终得到的是同一个实例,那么这就是单例模式。那么应该如何实现单例模式了:
想要实现单例模式,我们需要注意两点:
- 需要使用
return
。使用new
的时候如果没有手动设置return
,那么会默认返回this
。但是,我们这里要使得每次返回的实例相同,也就是需要手动控制创建的对象,因此这里需要使用return。 - 我们需要每次
return
的是同一个对象。也就是说实际上在第一次实例的时候,需要把这个实例保存起来。再下一个实例的时候,直接return
这个保存的实例。因此,这里需要用到闭包了。
代码实现如下:
(function(){
let instance = null;
return class{
constructor(){
if(!instance){
//第一次创建实例,那么需要把实例保存
instance = this;
}else{
return instance;
}
}
}
})()
let p3= new Person();
let p4 = new Person();
console.log(p3===p4) //true
从上面的代码中,我们可以看到在闭包中,使用instance
变量来保存创建的实例,每次返回的都是第一次创建的实例。这样的话就实现了无论创建多少次,创建的都是同一个实例,这就是单例模式。