单例模式 Singleton
产生唯一的实例,限制实例的数量只有一个。在 Java 中采用不定义无参构造函数,定义静态getInstance()方法的形式只返回唯一实例来实现
在 JavaScript 中没有类的概念,而且要考虑的方面也更多(例如 DOM),所以情况比较特殊
<!-- bad -->
var createMask = function(){
return document,body.appendChild( document.createElement(div) );
}
$( 'button' ).click( function(){
var mask = createMask();
mask.show();
});
<!-- singleton -->
var createMask = function(){
var mask;
return function(){
return mask || ( mask = document.body.appendChild( document.createElement('div') ) )
}
}();// 利用闭包和IIFE 返回实例,这样既保证了唯一性,又保证了封装性;
$('button').click( function() {
mask.show();
});
> 我们还可以封装一个Singleton的包装器
var singleton = function(fn){
let instance;
return function(){
instance || (instance = fn.apply(this,arguments));
}
}();
var createMask = singleton( function(){
return document.body.appendChild( document.createElement('div') );
});
const Singleton = (function () {
let instance; // 实例
function init() {
return {
publicProperty: "I am a property",
publicMethod: function () {
console.log("I am a method");
},
};
}
return {
getInstance: function () {
if (!instance) {
instance = init();
}
return instance;
},
};
})();
// 获取实例
const instance1 = Singleton.getInstance();
const instance2 = Singleton.getInstance();