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