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

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

单体基本结构是这样:

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. php-Mysql示例1

  2. winphone 开发学习笔记(2)

    导航 NavigationService.Navigate(new Uri("xxxx.xaml",UriKind.Relative)) xxx表示要跳转的目标页面 页面和页面导航 ...

  3. 【转】 各种 基于Unity3d 引擎的Android游戏优化 (drawcall)

     合并纹理,减少贴图数量,合并网格,ui上减少不必要的层级叠加关系等   1. 更新不透明贴图的压缩格式为ETC 4bit,因为android市场的手机中的GPU有多种,每家的GPU支持不同的压缩格式 ...

  4. 折腾iPhone的生活——AirDrop的使用

    AirDrop是iOS一个非常大的亮点,其实说是这么说了,但是事实上AirDrop并没有想象中那么好用. AirDrop就是一个用于无线传输文件的方式,实质性跟蓝牙没有太大区别,但是比蓝牙好用,有点像 ...

  5. Android Studio下载及离线升级方法

    由于众所周知的原因,android官网无法访问,所以我们要用到翻.墙.工具,我用的是自.由.门,大家自行搜索下载. android studio下载地址: https://dl.google.com/ ...

  6. 402. Remove K Digits

    (English version is after the code part) 这个题做起来比看起来容易,然后我也没仔细想,先速度刷完,以后再看有没有改进. 用这个来说: 1 2 4 3 2 2 1 ...

  7. PPT 学习总结

    PPT高效制作流程1.把word导入PPT2.在PPT里实现随机抽奖3.逻辑的调整:给PPT增加小节,来增强PPT的逻辑性4.设计PPT的母板,并可保存为自己的母板供以后使用 数据收集中国宏观经济统计 ...

  8. HDU 2069 Coin Change

    Coin Change Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total S ...

  9. 2015华为机试——数字基root

    题目描写叙述: 求整数的Root:给定正整数,求每位数字之和;假设和不是一位数,则反复; 输入:输入随意一个或多个整数 输出:输出各位数字之和,直到和为个位数为止(输入异常,则返回-1),多行,每行相 ...

  10. [转] webpack debug in webstorm

    先run build,然后用node server.js来做 WebStorm 11 adds support for debugging client-side apps built with We ...