js --单例模式

定义设计模式

一个构造函数在构造出一个对象后,以后再使用这个构造函数构造对象时,不会是新的对象,依旧是上一次的对象.也就是说:::浏览器

确保一个类仅有一个实例,并提供一个访问它的全局访问点。缓存

经过一个实用场景来理解单例模式的概念。当咱们点击登陆按钮的时候,会出现一个登陆的弹窗,而这个弹窗是惟一的,不论咱们点击多少次登陆按钮,弹窗只会被建立一次。函数

单例模式使用的场景

好比线程池、全局缓存等。咱们所熟知的浏览器的window对象就是一个单例,在JavaScript开发中,对于这种只须要一个的对象,咱们的实现每每使用单例。学习

实现思路this

用一个变量来标识当前的类已经建立过对象,若是下次获取当前类的实例时,直接返回以前建立的对象便可。spa

实现1:最简单的对象字面量prototype

var singleton = {
        attr : 1,
        method : function(){ return this.attr; }
    }
var t1 = singleton ;
var t2 = singleton ;
  那么很显然的, t1 === t2 。

这个在日常使用的时候,仍是挺多的,在没有学习单例设计模式的概念以前,不知道这种也属于单例的。不过,存在的不足之处就是没有什么封装,全部的属性方法都是暴露的。对于一些须要使用私有变量的状况也不太合适。不过就经过这个例子加深一下对单例的概念的理解。线程

实现2:设计

// 定义一个类
function Singleton(name) {
    this.name = name;
    this.instance = null;
}
// 原型扩展类的一个方法getName()
Singleton.prototype.getName = function() {
    console.log(this.name)
};
// 获取类的实例
Singleton.getInstance = function(name) {
    if(!this.instance) {
        this.instance = new Singleton(name);
    }
    return this.instance
};

// 获取对象1
var a = Singleton.getInstance('a');
// 获取对象2
var b = Singleton.getInstance('b');
// 进行比较
console.log(a === b); // true

总结:

  总的来讲,单例模式相对而言是各大模式中较为简单的,可是单例模式也是较为经常使用而且颇有用的模式。在JS中尤其突出(每一个对象字面量均可以看作是一个单例么~)。
    记住,是否严格的只须要一个实例对象的类(虽然JS没有类的概念),那么就要考虑使用单例模式。
    使用数据缓存来存储该单例,用做判断单例是否已经生成,是单例模式主要的实现思路。
相关文章
相关标签/搜索