软件工程中,设计模式非常常见,最简单,最被问到的单例设计模式,在JS中如何实现呢?
单例设计模式:单例设计模式(Singleton Pattern)确保一个类只有一个实例,并提供一个访问它的全局访问点。
单例模式的主要目的是节约系统资源,对资源进行控制。由于单例模式只生成一个对象,减少了系统开销,对一些需要频繁创建和销毁的对象具有很好的优化作用,如线程池、缓存。也能避免对一些用作工具类使用的对象的重复创建。
在 JS 中,可以通过以下几种方式实现单例模式:
- 对象字面量,利用对象字面量创建唯一的对象实例:
let singleton = {
name: 'singleton',
method() {
console.log(this.name);
}
};
- 通过工厂方法返回对象,检查对象是否已经实例化,如果是则返回已有实例,否则创建一个新实例。
let singleton = (function() {
let instance;
function createInstance() {
let object = new Object({
name: 'singleton',
method() {
console.log(this.name);
}
});
return object;
}
return {
getInstance() {
if (!instance) {
instance = createInstance();
}
return instance;
}
}
})();
- 构造函数,可以通过一个变量来存储对象实例,并在构造函数中检查该变量,来决定是否需要创建新实例。
let Singleton = (function() {
let instance;
function Singleton() {
if (instance) return instance;
instance = this;
}
Singleton.prototype.method = function() {
console.log('singleton method');
};
return Singleton;
})();
var s1 = new Singleton();
var s2 = new Singleton();
s1.method();
- ES6 中的 Symbol,利用 ES6 中的 Symbol 可以保证实例的唯一性。
let singletonSymbol = Symbol();
let Singleton = (function() {
let instance;
class Singleton {
constructor() {
if (instance) return instance;
instance = this;
}
method() {
console.log('singleton method');
}
}
Singleton[singletonSymbol] = new Singleton();
Object.freeze(Singleton);
return Singleton;
})();
let s1 = Singleton[singletonSymbol];
let s2 = Singleton[singletonSymbol];
s1.method();
有很多种方法可以实现 JavaScript 中的单例模式。具体如何使用,取决于需求场景和实现难易度。