单体是一个用来划分命名空间,并将一批相关方法和属性组织在一起的对象,如果它可以被实例化,那么它只能被实例化一次。

单体模式,就是将代码组织为一个逻辑单元,这个逻辑单元中的代码可以通过单一的变量进行访问。

单体基本结构是这样:

var Singleton = {
attribute1:true,
attribute2:,
method1:function(){},
method2:function(){}
}

借助闭包实现单体:

Namespace.Singleton = {}

定义之后立即执行的单体函数:

Namespace.Singleton = (function(){
return {
publicAttr:,
...
};
})();

我们添加那层函数包装,就是为了使用包装函数来添加真正的私有成员的闭包。

闭包单体的实现方法:

GiantCorp.DataParser = (function(){
var whitespaceRegex = /\s+/;
function stripWhitespace(str){
return str.replace(whitespaceRegex,'');
};
function stringSplit(str,delimiter){
return str.split(delimiter);
};
return {
stringToArray:function(str,delimiter,stripWS){
if(stripWS){
str = stripWhitespace(str);
}
var outputArray = stringSplit(str,delimiter);
return outputArray;
}
}
})();

该函数中,这些私有方法和属性可以直接访问其名称,不必在前面加this。把私有成员放到闭包中可以确保其不会在单体对象之外被使用。同时可以自由的改变对象的实现细节。还可以用这种办法对数据进行保护和封装。

使用这种方式,你可以享受真正的私有成员带来的好处,而不必付出什么代价,这是因为单体类只会被实例化一次,单体模式之所以是javascript中最流行的,应用最广泛的的模式之一,原因即在此。

单体的惰性实例化

前面所讲的单体模式的实现有一个共同点:单体对象都是脚本加载的时候被创建出来的。

对于资源密集型的或配置开销甚大的单体,也许更合理的做法就是将其实例化推迟到需要使用的时候,这种技术被称为惰性加载。它最常用于那些必须加载大量数据的单体。

下面展示如何将普通单体转化为惰性加载单体:

MyNamespace.Singleton = (function(){
var uniqueInstance;
function constructor(){
  .....
}
return {
getInstance:function(){
if(!uniqueInstance){
//没有实例化的情况下
uniqueInstance = constructor();
}
return uniqueInstance;
}
}
})();
//调用
MyNamespace.Singleton.getInstance().publiceMethod1();

分支:分支是一种用来把浏览器之间的差异封装到在运行期间进行折中的动态处理的技术。

下面欣赏使用分支技术创建XHR对象:

var SimpleXhrFactory =(function(){
var standard = {
createXhrObject:function(){
return new XMLHttpRequest();
}
}; var activeNew = {
createXhrObject:function(){
return new ActiveXObject('Msxml2.XMLHTTP');
}
}; var activeOld = {
createXhrObject:function(){
return new ActiveXObject('Microsoft.XMLHTTP');
}
}; var testObject = null;
try{
testObject = standard.createXhrObject();
return standard;
}
catch(e){
try{
testObject = activeNew.createXhrObject();
return activeNew;
}
catch(e){
try{
testObject = activeOld.createXhrObject();
return activeOld;
}
catch(e){
throw new Error('No XHR object found in this environment.');
}
}
}
})();

在大型项目中,单体可以起到优化的作用:那些开销大却又很少使用的组件可以被包装到惰性加载单体中;针对特点环境的代码则可以被包装到分支型单体中。

读书笔记之 - javascript 设计模式 - 单体模式的更多相关文章

  1. 读书笔记之 - javascript 设计模式 - 代理模式

    代理(proxy)是一个对象,它可以用来控制对另一对象的访问.它与另外那个对象实现了同样的接口,并且会把任何方法调用传递给那个对象.另外那个对象通常称为本体.代理可以代替本体被实例化,并使其可被远程访 ...

  2. 读书笔记之 - javascript 设计模式 - 门面模式

    门面模式有俩个作用: 简化类的接口 消除类与使用它的客户代码之间的耦合 在javascript中,门面模式常常是开发人员最亲密的朋友.它是几乎所有javascript库的核心原则,门面模式可以使库提供 ...

  3. 读书笔记之 - javascript 设计模式 - 工厂模式

    一个类或者对象中,往往会包含别的对象.在创建这种对象的时候,你可能习惯于使用常规方式,即用 new 关键字和类构造函数. 这会导致相关的俩个类之间产生依赖. 工厂模式,就是消除这俩个类之间的依赖性的一 ...

  4. 读书笔记之 - javascript 设计模式 - 命令模式

    本章研究的是一种封装方法调用的方式.命令模式与普通函数有所不同.它可以用来对方法调用进行参数化处理和传送,经过这样处理过的方法调用可以在任何需要的时候执行. 它也可以用来消除调用操作的对象和实现操作的 ...

  5. 读书笔记之 - javascript 设计模式 - 组合模式

    组合模式是一种专为创建Web上的动态用户界面而量身定制的模式,使用这种模式,可以用一条命令在对各对象上激发复杂的或递归的行为. 在组合对象的层次体系中有俩种类型对象:叶对象和组合对象.这是一个递归定义 ...

  6. JavaScript设计模式——单体模式

    一:单体模式简介: 是什么:将代码组织为一个逻辑单元,这个单元中的代码通过单一的变量进行访问.只要单体对象存在一份实例,就可以确信自己的所有代码使用的是同样的全局资源. 用途:1.用来划分命名空间,减 ...

  7. javascript设计模式-单体模式

    场景:假设有一个Girl(美女)实体,该实体拥有姓名.年龄两个属性,拥有显示姓名和洗澡两个方法,下面分步骤构造该实体. 1.用简单基本单体模式: var Girl1 = { name:"昭君 ...

  8. 读书笔记之 - javascript 设计模式 - 享元模式

    本章探讨另一种优化模式-享元模式,它最适合于解决因创建大量类似对象而累及性能的问题.这种模式在javascript中尤其有用,因为复杂的javascript代码很快就会用光浏览器的所有可用内存,通过把 ...

  9. 读书笔记之 - javascript 设计模式 - 责任链模式

    责任链模式可以用来消除请求的发送者和接收者之间的耦合.这是通过实现一个由隐式地对请求进行处理的对象组成的链而做到的.链中的每个对象可以处理请求,也可以将其传给下一个对象. 责任链的结构: 责任链由多个 ...

随机推荐

  1. ZOJ Problem Set - 3758 素数

    Singles' Day Time Limit: 2 Seconds Memory Limit: 65536 KB Singles' Day(or One's Day), an unofficial ...

  2. Alfred(未完待续)

    之前曾经有写过一篇QuickSilver的博文,大力称赞它是Mac下的神器,但是现在,QS光荣下岗了,因为我找到了另外一款比QS更加好用,更加神器的APP:Alfred小帽子. 软件名:Alfred ...

  3. SWMM[Storm Water Management Model]模型代码编译调试环境设置

    1. 下载计算引擎源代码后解压, 目前最新版本5-0-022. 其中包含源文件和工程文件,选择vc2005_con.在源代码目录下创建VC2005_CON目录拷贝VC2005-CON.VCPROJ 放 ...

  4. SRM 387(1-250pt)

    DIV1 300pt 题意:有m种颜色的球若干个放在n个盒子里.每次操作可从一个盒子里拿出任意个球(不必同色),放进另一个盒子.要求终态为:1.最多有一个盒子里面装有不同色的球,该盒子成为joker ...

  5. 短随机唯一id生成参考

    <?php function getRandOnlyId() { //新时间截定义,基于世界未日2012-12-21的时间戳. $endtime=1356019200;//2012-12-21时 ...

  6. centos 6.5上部署jetty

    和tomcat是一样的,在部署容器之前,我们首先得有java环境 这里我们选择用rpm包的方式安装jdk 这里我们上传我之前下载好的jdk包 然后按照该文章http://blog.csdn.net/x ...

  7. Java 23种设计模式详尽分析与实例解析之一--创建型模式

    面向对象的设计原则 常用的面向对象设计原则包括7个,这些原则并不是独立存在的,它们相互依赖.互为补充. Java设计模式 创建型模式 简单工厂模式 模式动机: 考虑一个简单的软件应用场景,一个软件系统 ...

  8. Java处理文件小例子--获取全国所有城市的坐标

    需求:前端展示数据,全国城市的坐标

  9. git学习 #2:git基本操作

    本文出自   http://blog.csdn.net/shuangde800 ------------------------------------------------------------ ...

  10. Google Android开发入门与实战

    http://www.pc6.com/softview/SoftView_58350.html