Singleton 是什么
单例模式是指:一个类仅有一个实例,并且有一个访问点可以访问到这个类;为了实现单例模式,需要在类第一次被调用的时候,将实例保存下来;在这个类被第 n 次调用时,将第一次的实例返回。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
let createSingleton = (() => {
let singleton;
return function () {
if (!singleton) {
// 将创建的对象保存在闭包里
singleton = Object.create(null);
}
return singleton;
};
})();
// 每次调用都指向闭包里的变量 singleton
let a = createSingleton();
let b = createSingleton();
console.log(a === b); // true
|
单例模式的应用:命名空间
最简单的单例模式就是以字面量这种形式创建的对象,这种最简单的单例模式可以防止全局变量被污染。
1
2
3
4
5
6
7
|
// 命名空间可以将同命方法隔离开来,避免被不小心篡改
const lxh = {
speak() {}
};
const zpp = {
speak() {}
};
|
单例模式的应用:管理模块
1
2
3
4
5
6
7
|
// f1 ,f2, f3 由命名空间 example 管理
const example = (function () {
let f1 = function () {};
let f2 = function () {};
let f3 = function () {};
return { f1, f2, f3 };
})();
|
ES6 单例模式
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
class Apple {
constructor(name, creator, products) {
// 这个判断可以保证类实例化之后的对象均指向类的静态属性 instance
if (!Apple.instance) {
this.name = name;
this.creator = creator;
this.products = products;
// 在调用 new 时,this 指向实例化的对象
Apple.instance = this;
}
// 每次调用 constructor,返回的都是第一次实例化返回的对象
return Apple.instance;
}
}
let a1 = new Apple('apple, inc', 'steve jobs', 'iPhone...');
let a2 = new Apple('apple, inc', 'tim cook', 'MacBook...');
console.log(a1); // {name: "apple, inc", creator: "steve jobs", products: "iPhone..."}
console.log(a2); // {name: "apple, inc", creator: "steve jobs", products: "iPhone..."}
console.log(a1 === a2); // true
|
参考