08-单例模式

1、模式定义

单例模式,又被称为单体模式,是只允许实例化一次的对象类。比如我们用一个对象来规划命名空间,并井井有条地管理对象上的属性和方法。

单例模式,可能是JavaScript中最常见的一种设计模式了。这种模式经常用于为我们提供一个命名空间,比如jQuery库就使用了单例模式提供了一个命名空间 $ 。单例模式,是一种代码管理的优秀实践。

2、用单例模式提供一个独立的命名空间

// 单例模式(提供一个独立的命名空间)
var Xia = {
    g: function(id){
        return document.getElementById(id);
    },
    css: function(id,key,value){
        this.g(id).style[key] = value;
    },
    attr: function(id,key,value){
        this.g(id)[key] = value;
    },
    html: function(id,type,fn){
        this.g(id)['on'+type] = fn;
    }
}

3、单例模式可以让模块更加分明

单例模式除了可以提供独立的命名空间以外,还可以用来管理代码库中的多个模块。

// 单例模式的另一个作用:模块分明
baidu.dom.addClass    // 添加新元素
baidu.dom.append      // 插入元素
baidu.event.stopPropagation
baidu.event.preventDefault
baidu.string.trim
baidu.string.encodeHTML
// 用单例模式,自定义模块库
var A = {
    Util: {
        util_method1: function(){},
        util_method2: function(){}
    },
    Tool: {
        tool_method1: function(){},
        tool_method2: function(){}
    },
    Ajax: {
        get: function(){},
        post: function(){}
    },
    Others: {
        // ...
    }
}

// 使用自己的模块
A.Util.util_method2();
A.Ajax.get();

4、用单例模式实现静态变量(不可改变的变量)

JavaScript语言没有提供 static 静态的变量。因此,在理论上讲,所有的JavaScript变量都可以被修改。如何代码示例,我们实现了静态变量功能,使得这些变量只能被访问而不能被修改。

// 用单例模式管理静态变量
var Conf = (function(){
    // 不可修改的静态变量,其标识符通常都大写
    var conf = {
        MAX_NUM: 1000,
        MIN_NUM: 1,
        COUNT: 500
    };
    // 返回取值对象
    return {
        get: function(name){
            return conf[name] ? conf[name] : null;
        }
    }
    // 没有setter赋值器,我们就不能修改这些变量,即实现了静态变量的功能
})();

// 测试
var count = Conf.get('COUNT');
console.log(count);

5、惰性单例

有时候,对于单例对象需要被延迟创建,所以在单例模式中还存在一种延迟创建单例的形式,即“惰性单例”。

// 单例的延迟创建、惰性创建 
var LazySingle = (function(){
    // 单例实例的引用
    var _instance = null;
    // 单例
    function Single(){
        return {
            publicMethod: function(){},
            publicProperty: '1.0'
        }
    }
    // 延迟创建单例
    return function(){
        if(!_instance){
            _instance = Single();
        }
        return _instance;
    }
})();

// 测试
console.log(LazySingle().publicProperty);


完!!!

你可能感兴趣的:(08-单例模式)