javascript设计模式——单例模式

单例模式

单例模式是指在您要确保始终只创建一个对象实例时使用的设计模式。 在面向对象的经典编程语言中,创建单例模式背后的概念多少有点让人难以理解,因为其中包含一个同时具有静态及非静态属性和方法的类。 但本文主要讨论 JavaScript,因此,由于 JavaScript 是一种不包含真正类的动态语言,因此 JavaScript 版本的单例模式极其简单。

为什么需要采用单例模式?

在我开始介绍实施细节之前,我需要探讨一下为什么单例模式对于应用程序非常有用。 它能够确保您只有一个对象实例能够实际派上用场。 在服务器端语言中,您可能会使用单例处理数据库连接,这是由于为一个请求创建多个数据库连接纯粹是一种资源浪费。 同样,在前端 JavaScript 中,您可能会希望将负责处理所有 AJAX 请求的某个对象设置为单例。 规则非常简单: 如果每次创建新实例时,实例的功能均完全相同,那么将其设置为单例。

但是,这并不是采用单例的唯一原因。 至少在 JavaScript 中,单例可让您保证命名空间对象和函数井然有序,防止它们与全局命名空间混淆,您可能明白,这是一种可怕的想法,特别是在使用第三方代码的情况下。 使用命名空间单例模式也被称为模块设计模式。

展示单例模式

要创建单例,您只需创建一个对象文字。

var Singleton = {
    prop: 1,
    another_prop: 'value',
    method: function() {…},
    another_method: function() {…}
};

您还可以创建具有私有属性和方法的单例,但由于其涉及使用封闭函数和自调用匿名函数,因而稍微有些难以理解。 函数内部声明了一些局部函数和/或变量。 然后,创建并返回一个对象文字,其中包含一些引用您在更大的函数范围内声明的变量和函数的方法。 紧随函数声明放置 () 即可立即执行外部函数,并将所得的对象文字分配给变量。 如果这些介绍让您感到困惑,那么请看下面的代码,随后我将会做出进一步的说明。

var Singleton = (function() {
    var private_property = 0,
        private_method = function () {
            console.log('This is private');
        }

    return {
        prop: 1,
        another_prop: 'value',
        method: function() {
            private_method();
            return private_property;
        },
        another_method: function() {…}
    }
}());

关键在于,当通过某个变量所在函数前方的 Var 声明该变量时,该变量只能在函数内部通过该函数内声明的各函数(例如对象文字内的函数)进行访问。 return 语句可帮助我们回到在外部函数自行执行后分配给单例的对象文字。

单例模式命名空间
在 JavaScript 中,命名空间化通过将对象作为另一对象的属性添加来完成,因此深度为一个或多个图层。 这对于将代码组合成逻辑片段非常有用。 虽然我认为 YUI JavaScript 库在一定程度上命名空间层次过多,但总体而言仍可算作将嵌套命名空间限制在只有几个或更少图层的最佳实践。 以下代码是一个命名空间示例。

var Namespace = {
    Util: {
        util_method1: function() {…},
        util_method2: function() {…}
    },
    Ajax: {
        ajax_method: function() {…}
    },
    some_method: function() {…}
};

// Here's what it looks like when it's used
Namespace.Util.util_method1();
Namespace.Ajax.ajax_method();
Namespace.some_method();

如前所述,使用命名空间保证全局变量数量最低。 您甚至可以将整个应用程序连接到单一对象命名空间命名的应用程序(如果您有这项特权的话)。

你可能感兴趣的:(JavaScript,设计模式,单例模式)