您的位置:首页 > Web前端 > JavaScript

js设计模式——单例/单体模式

2012-02-19 17:15 120 查看
JavaScript中的单例模式是最常用的、最基本的设计模式,它提供了一种命名空间,减少全局变量泛滥的代码管理机制;

1、最常见的单例模式:

//一般用function定义的类,我才会采用首字母大写的方法来约定这个变量为类
//而对于这种伪类,我通常习惯于使用驼峰式命名法
var singleton = {
attr1: '',
attr2: '',
method1: function() {},
method2:  function() {}
};


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

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

var singleton = (function() {
var _a, _b;    //私有变量

var that = {}; //new某个类

//公开接口
that.getA = function() {
return _a;
};
that.setA = function(a) {
_a = a;
};

that.getB = function() {
return _b;
};
that.setB = function(b) {
_b = b;

};

return that;   //返回单例
})();


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

3、lazy方式的单例模式:

var singleton = (function() {
var _a, _b; //私有变量
var Class = function() {
//code
};
var that = {};
//公开接口
that.getA = function() {
return _a;
};
that.setA = function(a) {
_a = a;
};
that.getB = function() {
return _b;
};
that.setB = function(b) {
_b = b;
};
var _instance = null;
var getInstance = function() {
if(!_instance) {
_instance = new Class();
}
return _instance;
};
Class.prototype = that;
return {
getInstance: getInstance
};
})();


那么这种方法就可以在确实需要这段代码的时候,才实例化,实现懒惰性的单例模式!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: