单例模式:确保一个类仅有一个实例,并提供一个访问它的全局访问点。
比如购物车,登录框,redux和vuex的store 等这些都是单例模式,我下来看一下单例模式的UML类图。
一个私有化属性instance用来保存唯一实例,私有化构造函数防止其他对象可以通过new运算符来生成新对象,一个共有的函数提供全局访问点,其他对象想要使用Singleton实例 必须调用它才行。
很遗憾的是,JS没有private关键字,也就是说我们不能正常的像JAVA,C#那样使用单例模式,但是我们可以用其他方法写一个假的单例模式。
class CreateSingleton {
constructor(name) {
this.name = name;
}
speak() {
console.log(`I am ${this.name}`);
}
}
const Singleton = (function () {
let instance = null;
return function (name) {
if (!instance) instance = new CreateSingleton(name);
return instance
}
})();
const p1 = new Singleton("cyl");
const p2 = new Singleton("lyc");
p1.speak();
p2.speak();
console.log(p1 === p2)
我们还可以使用其他方法。
class Singleton {
constructor(name) {
this.name = name;
}
}
Singleton.getInstance = (function () {
let instance = null;
return function (name) {
if (!instance) {
instance = new Singleton(name);
}
return instance;
}
})();
const p1 = Singleton.getInstance("cyl");
const p2 = Singleton.getInstance("lyc");
console.log(p1 === p2);
单例模式符合单一职责而且没有违背开放封闭。
大家可以看左边个人分类的目录,跟着一起学习。