传统单例模式

单例模式的基本结构:

美高梅电子游戏,保证一个类仅有一个实例,并提供一个访问它的全局访问点。

MyNamespace.Singleton = function() {
 return {};
}();

实现单例核心思想

比如:

无非是用一个变量来标志当前是否已经为某个类创建过对象,如果是,则在下一次获取该类的实例时,直接返回之前创建的对象,接下来我们用JavaScript来强行实现这个思路,请看代码:

MyNamespace.Singleton = (function() {
 return 
    { 
     // Public members.
  publicAttribute1: true,
  publicAttribute2: 10,
  publicMethod1: function() {
  ...
  },
  publicMethod2: function(args) 
     {
   ...
  }
 };
})();
var Singleton = function( name ){
  this.name = name;
};
Singleton.prototype.getName = function(){   alert ( this.name );
};
Singleton.getInstance = (function(){   var instance = null;
  return function( name ){
          if ( !instance ){
            instance = new Singleton( name );
          }
        return instance;       }
})();

蒲京娱乐场,www.7376.com,奥门新浦京的网址 ,但是,上面的Singleton在代码一加载的时候就已经建立了,怎么延迟加载呢?采用下面这种模式:

我们通过Singleton.getInstance来获取Singleton类的唯一对象,这样确实是没问题的,但是js本身是没有类这种概念的,所以我们强行用传统单例思想来实现是没有任何意义的,这样的代码又臭又长(其实是我自己看着不舒服嘻嘻嘻)。下面我们使用JavaScript的闭包来实现一个单例,请看代码:

MyNamespace.Singleton = (function() {
 function constructor() 
    { 
     // All of the normal singleton code goes here.
  ...
 }
 return 
    {
  getInstance: function() 
        {
   // Control code goes here.
  }
 }
})();
var CreateDiv = (function(){       var instance;
      var CreateDiv = function( html ){           if ( instance ){
            return instance;           }
          this.html = html; this.init();
          return instance = this;
};
CreateDiv.prototype.init = function(){
var div = document.createElement( 'div' );
div.innerHTML = this.html; 
document.body.appendChild( div );
      };
      return CreateDiv; })();
var a = new CreateDiv( 'sven1' ); var b = new CreateDiv( 'sven2' );
alert ( a === b ); // true

具体来说,把创建单例的代码放到constructor里,在首次调用的时候再实例化:

可以看到,这样我们确实用闭包来实现了一个单例,但这个代码还是高度耦合的,CreateDiv的构造函数实际上负责了两件事情。第一是创建对象和执行初始化init方法,第二是保证只有一个对象。这样的代码是职责不明确的,现在我们要把这两个工作分开,构造函数就负责构建对象,至于判断是返回现有对象还是构造新的对象并返回,我们交给另外一个函数去完成,其实也就是为了满足一个编程思想:单一职责原则。这样的代码才能更好的解耦,请看下面代码:

完整的代码如下:

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('sven1');
  var b = new ProxySingletonCreateDiv('sven2');
  alert(a === b); //true
MyNamespace.Singleton = (function() {
 var uniqueInstance; // Private attribute that holds the single instance.
 function constructor() 
    { 
     // All of the normal singleton code goes here.
  ...
 }
 return 
    {
  getInstance: function() 
        {
   if(!uniqueInstance) { 
            // Instantiate only if the instance doesn't exist.
      uniqueInstance = constructor();
  }
  return uniqueInstance;
 }
}
})();

Author

发表评论

电子邮件地址不会被公开。 必填项已用*标注

相关文章