JavaScript 设计模式之单例模式

1.单例模式

单例就是保证一个类只有一个实例,实现方法通常是先判断实例存在与否,若是存在直接返回,若是不存在就建立了再返回,这就确保了一个类只有一个实例对象。在JavaScript里,单例做为一个命名空间提供者,从全局命名空间里提供一个惟一的访问点来访问该对象。javascript

单例模式的思路是:一个类能返回一个对象的引用(而且永远是同一个)和一个得到该实例的方法(静态方法,一般使用 getInstance 名称)。那么当咱们调用这个方法时,若是类持有的引用不为空就返回该引用,否者就建立该类的实例,而且将实例引用赋值给该类保持的那个引用再返回。同时将该类的构造函数定义为私有方法,避免其余函数使用该构造函数来实例化对象,只经过该类的静态方法来获得该类的惟一实例java

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

var singleton = {
        attr : 1,
        method : function(){ return this.attr; }
    }
var t1 = singleton ;
var t2 = singleton ;

那么很显然的, t1 === t2 。缓存

十分简单,而且很是使用,不足之处在于没有什么封装性,全部的属性方法都是暴露的。对于一些须要使用私有变量的状况就显得爱莫能助了。固然在对于 this 的问题上也是有必定弊端的。安全

 实现2:构造函数内部判断

function Construct(){
    // 确保只有单例
    if( Construct.unique !== undefined ){
        return Construct.unique; 
    }
    // 其余代码
    this.name = "NYF";
    this.age="24";
    Construct.unique = this;
}

那么也有的, t1 === t2 。闭包

也是很是简单,无非就是提出一个属性来作判断,可是该方式也没有安全性,一旦我在外部修改了Construct的unique属性,那么单例模式也就被破坏了。函数

 实现3 : 闭包方式  

    对于大着 灵活 牌子的JS来讲,任何问题都能找到 n 种答案,只不过让我本身去掂量孰优孰劣而已,下面就简单的举几个使用闭包实现单例模式的方法,无非也就是将建立了的单例缓存而已。this

var single = (function(){
    var unique;
    function Construct(){
        // ... 生成单例的构造函数的代码
    }
    unique = new Constuct();
    return unique;
})();

只要 每次讲 var t1 = single; var t2 = single;便可。 与对象字面量方式相似。不过相对而言更安全一点,固然也不是绝对安全。spa

 若是但愿会用调用 single() 方式来使用,那么也只须要将内部的 return 改成code

return function(){

      return unique;

 } 

    以上方式也可使用 new 的方式来进行(形式主义的赶脚)。固然这边只是给了闭包的一种例子而已,也能够在 Construct 中判断单例是否存在 等等。 各类方式在各个不一样状况作好选着便可。对象

总结

    总的来讲,单例模式相对而言是各大模式中较为简单的,可是单例模式也是较为经常使用而且颇有用的模式。在JS中尤其突出(每一个对象字面量均可以看作是一个单例么~)。

    记住,是否严格的只须要一个实例对象的类(虽然JS没有类的概念),那么就要考虑使用单例模式。

    使用数据缓存来存储该单例,用做判断单例是否已经生成,是单例模式主要的实现思路。

相关文章
相关标签/搜索