定义:一个类仅有一个实例,并提供一个访问它的全局访问点
实现思路:通过一个变量判断是否已经创建过对象了,如果是,直接返回此变量。
基础实现
/**
* 单例模式基础实现
* 缺点:没有透明化
* @param {String} name
*/
var Singleton = function (name) {
this.name = name
}
Singleton.prototype.getName = function () {
console.log(this.name)
}
Singleton.getInstance = function (name) {
var instance = null
return function (name) {
if (!instance) {
instance = new Singleton(name)
}
return instance
}
}
var a = Singleton.getInstance('test1')
使用代理类实现单例模式
var CreateDiv = function (html) {
this.html = html
this.init()
}
CreateDiv.prototype.init = function () {
var div = document.createElement('div')
div.innerHTML = this.html
document.body.appendChild(div)
}
// 使用代理实现单例模式
var ProxySingletonCreateDiv = (function () {
var instance
return function (html) {
if (!instance) {
instance = new CreateDiv(html)
}
return instance
}
})()
var a = new ProxySingletonCreateDiv('test1')
惰性单例
在需要的时候才会创建实例,并且只创建一个实例
通常会把创建对象和管理实例职责分开,以达到组件复用的作用
/**
*
* 创建对象和管理单例的职责要分开
*/
var getSingle = function (fn) {
var result
return function () {
return result || (result = fn.apply(this, arguments))
}
}
var createLoginLayer = function () {
var div = document.createElement('div')
div.innerHTML = '我是浮窗'
div.style.display = 'none'
document.body.appendChild(div)
return div
}
var createSingleLoginLayer = getSingle(createLoginLayer)