资讯专栏INFORMATION COLUMN

Javascript设计模式(三)单例模式

孙吉亮 / 3112人阅读

摘要:单例模式的定义是保证一个类只有仅有一个实例,并提供一个访问它的全局访问点。并且按照单一职责原则类实现功能类管理单例管理单例模式,达到可组合的的效果创建普通类引入代理类惰性单例模式分离创建实例对象的职责与管理单例的职责。

单例模式的定义是:保证一个类只有仅有一个实例,并提供一个访问它的全局访问点。

单例模式是一种常用的模式,有些对象我们往往只需要一个,比如线程池,全局缓存,window对象。

简单单例模式

要实现一个单例模式并不复杂,无非是用一个变量来标志当前是否已经为某个类创建过对象,如果是,则在下一次获取该类的时候,直接返回之前创建的对象。

var Singleton = function(name) {
    this.name = name
    this.instance = null
}

Singleton.prototype.getName = function() {
    alert(this.name)
}

Singleton.getInstance = function(name) {
    if (!this.instance) {
        this.instance = new Singleton(name)
    }
    return this.instance
}
var a = Singleton.getInstance("sven1")
var b = Singleton.getInstance("sven2")  

alert(a===b) // true

通过Singleton.getInstance来获取Singleton类的唯一对象,这种方式相对简单,但有问题,使用者并不知道这是一个单例类

用代理实现的单例模式

我们现在的目标是实现一个透明的单例类,用户从这个类中获取对象的时候,可以像使用其他普通类一样。并且按照单一职责原则,createDiv类实现功能,proxySingletonCreateDiv类管理单例管理单例模式,达到可组合的的效果

// 创建普通类
var CreateDiv = function(html){
    this.html = html
    this.init()
}

CreateDiv.prototype.init = function() {
    var div = document.createComment("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("sven1")
var b = new proxySingletonCreateDiv("sven2")  

alert(a===b) // true
惰性单例模式

分离创建实例对象的职责与管理单例的职责。下面用创建一个登陆框举例

// 管理单例
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)

document.getElementById("loginBtn").onclick = function(){
    var loginLayer = createSingleLoginLayer()
    loginLayer.style.display = "block"
}

单例模式是一种简单但非常使用的技术,特别是惰性单例技术,在合适的时候才创建对象,并且至创建唯一的一个。更奇妙的是,创建对象和管理单例的职责被分布在两个不同的方法中,这两个方法组合起来才具有单例模式的威力。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/99161.html

相关文章

  • javascript单例、代理、状态设计模式

    摘要:代理模式代理模式为一个对象提供一个代用品或占位符,以便控制对于它访问。这种代理就叫虚拟代理。保护代理用于对象应该有不同访问权限情况。写时复制代理时虚拟代理的一种变体。 一、创建型设计模式(三大类设计模式) 创建型设计模式 --创建说明该类别里面的设计模式就是用来创建对象的,也就是在不同的场景下我们应该选用什么样的方式来创建对象。 1. 单例模式 ==单例模式(Singleton)==:...

    0xE7A38A 评论0 收藏0
  • JavaScript设计模式-第一部分:单例模式、组合模式和外观模式

    摘要:但是,这并不是采用单例的唯一原因。使用命名空间单例模式也被称为模块设计模式。函数内部声明了一些局部函数和或变量。紧随函数声明放置即可立即执行外部函数,并将所得的对象文字费赔给变量。 JavaScript设计模式-第一部分:单例模式、组合模式和外观模式 设计模式是一些可靠的编程方式,有助于保证代码更加易于维护、扩展及分离,所有设计模式在创建大型JavaScript应用程序时均不可或缺 单...

    betacat 评论0 收藏0
  • JavaScript设计模式单例模式

    摘要:此时我们创建的对象内保存静态变量通过取值器访问,最后将这个对象作为一个单例放在全局空间里面作为静态变量单例对象供他人使用。 单例模式 又被称为单体模式,是只允许实例化一次的对象类。有时我们也用一个对象来规划一个命名空间,井井有条的管理对象上面的属性和方法。 传统的面向对象语言中单例模式的实现,均是单例对象从类中创建而来,在以类为中心的语言中,这是很常见的做法。如果需要某个对象,就必须先...

    zhaot 评论0 收藏0
  • JavaScript设计模式----单例模式

    摘要:不符合设计模式中的单一职责的概念。引入代理实现单例模式引入代理实现单例模式的特点我们负责管理单例的逻辑移到了代理类中。的单例模式对比在以上的代码中实现的单例模式都混入了传统面向对象语言的特点。 声明:这个系列为阅读《JavaScript设计模式与开发实践》 ----曾探@著一书的读书笔记 1.单例模式的特点和定义 保证一个类仅有一个实例,并且提供一个访问它的全局访问点。 2.传统面向对...

    selfimpr 评论0 收藏0
  • JavaScript 设计模式(一):单例模式

    摘要:停更许久,近期计划更新设计模式系列。单例模式是创建型设计模式的一种。虽然它不是正规的单例模式,但不可否认确实具备类单例模式的特点。适用场景单例模式的特点,意图解决维护一个全局实例对象。 停更许久,近期计划更新:设计模式系列。 showImg(https://segmentfault.com/img/bVbt7uw?w=800&h=600); 单例模式:限制类实例化次数只能一次,一个类只...

    xialong 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<