一、定义
单体模式(singleton)是javascript中最基本但又最有用的模式之一,它可能比其他任何模式都更常用。单体是一个用来划分命名空间并将一批相关属性和方法组织在一起的对象,如果它可以被实例化,那么它只能被实例化一次。
简单的理解就是一个类只有一个实例
二、用途
可以用来划分命名空间,以减少网页中全局变量的数目。我们所熟知的浏览器的window对象就是一个单例,在JavaScript开发中,对于这种只需要一个的对象,我们的实现往往使用单例。
三、特点
该类只有一个对象 改类自行创建修改实例 向整个系统公开这个实例接口
四 划分命名空间
单体对象由两部分组成:包含着方法和属性成员的对象自身,以及用于访问它的变量。这个变量通常是全局性的,以便在网页的任何地方都能直接访问到它所指向的单体对象。 eg:
这段代码先是声明了findProduct的函数,在后来我们不经意间就会覆盖掉这个函数,如果我们改成下面这段代码,就不会出现这样的问题:
现在findProduct变成ProductTools的一个方法,它不会被全局命名空间中的任何新变量改写。而且这个方法可以在全局的任何地方访问,访问方式必须使用圆点进行访问。同时也可以自己定义一个全局对象,把自已所有的代码封装到里边。以减小和外部变量的冲突
五、惰性实例化
对于资源密集型或资源开销大的单体,将其实例化推迟到需要使用它的时候。这种技术称为惰性加载(lazy loading) 惰性加载单体的特别之处在于对它们的访问必须借助一个静态方法。这个方法用来检测(或判断)单体是否实例化。如果实例化将返回实例化反之创建并返回实例化。
六、优点以及缺点
单体模式的主要好处在于它对代码的组织作用。把相关的属性和方法组织在一个不会多次被实例化的单体中,可以使代码的维护和调试更加方便。描述性的命名空间可以增强代码的自我说明性,有利于阅读和理解。同时防止代码被别的程序员篡改。惰性加载减少那些不必要的内存消耗。
由于单体模式提供的是一种单点访问,有可能导致模块间的耦合。
小结:
单体模式是javascript最基本的模式之一,不仅可以单独使用,而且可以和大多数的模式配合使用。单体模式对于创建可重用的模块化代码很有用处。可以把你的代码包装在一个单体中,不必担心别人在写的时候改写自己的全局变量。