单例模式之所以这么叫,是因为它限制一个类只能有一个实例化对象。经典的实现方式是,创建一个类,这个类包含一个方法,该方法在没有对象存在时,将会创建一个新的实例对象。如果对象存在,这个方法只是返回这个对象的引用。
let singleton = (() => {
let instance;
function init() {
// 私有变量和方法
let privateString = 'I am private';
function privateMethod() {
console.log('I am a private method');
}
// 公有变量和方法
return {
publicString: 'I am public',
publicMethod: () => {
console.log('I am a public method');
}
};
}
let _value = {
// 如果存在获取此单例实例,如果不存在创建一个单例实例
getInstance: () => {
if (!instance) {
instance = init();
}
return instance;
}
};
return _value;
})();
let myInstance = singleton.getInstance();
console.log(myInstance.publicString);
myInstance.publicMethod();
如果需要扩展这个唯一的实例,可以重新定义获取实例的方法
singleton.getInstance = () => {
if (!this._instance) {
if (isFoo) {
this._instance = new FooSingleton();
} else {
this._instance = new BasicSingleton()
}
}
}
为什么需要单例模式,而不是直接定义一个静态对象
const object = {
publicString: 'I am public',
publicMethod: () => {
console.log('I am a public method');
}
}
因为单例可以懒构造,在真正用到之前(调用getInstance()之前),单例模式不需要分配资源或者内存。