JavaScript设计模式-第一部分:单例模式、组合模式和外观模式
JavaScript设计模式-第一部分:单例模式、组合模式和外观模式
设计模式是一些可靠的编程方式,有助于保证代码更加易于维护、扩展及分离,所有设计模式在创建大型JavaScript应用程序时均不可或缺
单例模式
单例模式是指在您要确保始终只创建一个对象实例时使用的设计模式。在面向对象的经典编程语言中,创建单例模式背后的概念多少有点让人难以理解,因为其中包含一个同时具有静态及非静态属性和方法的类。但本文主要讨论JavaScript,因此,由于JavaScript是一种不包含真正类的动态语言,因此JavaScript版本的单例模式极其简单。
为什么需要采用单例模式?
在我开始介绍实施细节之前,我需要探讨一下为什么单例模式对于应用程序非常有用。它能够确保您只有一个对象实例能够实际派上用场。在服务器端语言中,您可能会使用单例处理数据库连接,这是由于为一个请求创建多个数据库连接纯粹是一种资源浪费。同样,在前端JavaScript中,您可能会希望将负责处理所有AJAX请求的某个对象设置为单例。规则非常简单:如果每m次创建新实例时,实例的功能均完全相同,那么将其设置为单例。
但是,这并不是采用单例的唯一原因。至少在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() {...}, another_method: function() {...} } }());
关键在于,当通过某个变量所在函数前方的var声明该变量时,该变量只能在函数内部通过该函数内声明的各函数(例如对象文字内函数)进行访问。return语句可帮助我们回到在外部函数自行执行后分配给单例的对象文字。