js设计模式-单例模式

Posted 平凡的世界

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了js设计模式-单例模式相关的知识,希望对你有一定的参考价值。

 

javascript中的单例模式是最常用的、最基本的设计模式,它提供了一种命名空间,减少全局变量泛滥的代码管理机制;

1、最常见的单例模式:

 

[javascript] view plain copy
 
  1. //一般用function定义的类,我才会采用首字母大写的方法来约定这个变量为类  
  2. //而对于这种伪类,我通常习惯于使用驼峰式命名法  
  3. var singleton = {  
  4.       attr1: ‘‘,  
  5.       attr2: ‘‘,  
  6.       method1: function() {},  
  7.      method2:  function() {}  
  8. };  



 

这是JavaScript开发中最常用的代码组织方式,这种方式在JavaScript执行的时候,就已经创建了实例对象。这样创建的实例对象,所有的属性、方法都是公开的,有一定的风险;一般使用这样的单例模式,我们可以采用下划线_来命名私有变量,来约定为私有变量。但是很不靠谱!

2、闭包方法的单例模式:

 

[javascript] view plain copy
 
  1. var singleton = (function() {  
  2.       var _a, _b;    //私有变量  
  3.    
  4.      var that = {}; //new某个类  
  5.    
  6.      //公开接口  
  7.      that.getA = function() {  
  8.           return _a;  
  9.     };  
  10.     that.setA = function(a) {  
  11.          _a = a;  
  12.     };  
  13.    
  14.     that.getB = function() {  
  15.          return _b;  
  16.     };  
  17.     that.setB = function(b) {  
  18.          _b = b;  
  19.    
  20.     };  
  21.    
  22.     return that;   //返回单例  
  23. })();  



 

 

以上这种方法,实现了单例的私有变量对用户透明,用户所能知道的只有公开的接口,不能随意改变私有变量,但是这种方法还是在执行脚步的时候就产生了一个单例,用户有可能根本就不使用这段代码,这样就会造成内存浪费,更好的做法是将类的实例化推迟到需要的时候再实例化;

3、lazy方式的单例模式:

 

[javascript] view plain copy
 
  1. var singleton = (function() {  
  2.       var _a, _b; //私有变量      
  3.       var Class = function() {  
  4.            //code  
  5.       };  
  6.      var that = {};  
  7.     //公开接口  
  8.      that.getA = function() {  
  9.          return _a;  
  10.     };  
  11.     that.setA = function(a) {  
  12.         _a = a;  
  13.     };  
  14.     that.getB = function() {  
  15.         return _b;  
  16.     };  
  17.     that.setB = function(b) {  
  18.        _b = b;  
  19.     };   
  20.     var _instance = null;  
  21.     var getInstance = function() {  
  22.           if(!_instance) {  
  23.                  _instance = new Class();  
  24.            }     
  25.            return _instance;  
  26.     };  
  27.      Class.prototype = that;  
  28.     return {  
  29.           getInstance: getInstance  
  30.    };  
  31. })();  



 

 

那么这种方法就可以在确实需要这段代码的时候,才实例化,实现懒惰性的单例模式!

以上是关于js设计模式-单例模式的主要内容,如果未能解决你的问题,请参考以下文章

JS设计模式1-单例模式

JS单例模式

js设计模式之单例模式实例

JS设计模式一:单例模式

js设计模式-单例模式

设计模式——JS中的单例模式应用