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

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

单体基本结构是这样:

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. openstack grizzly版network网络节点安装

    版本以及源的配置和控制节点一致 1.安装完操作系统已经apt源配置完成之后,一定要执行 apt-get update root@cloud:~# mv /etc/apt/sources.list /e ...

  2. 《University Calculus》-chape4-极坐标与圆锥曲线-极坐标系下的面积与弧长

    极坐标系下的面积: 在直角坐标系下一样,这里在极坐标系下,我们面临一个同样的问题:如何求解一个曲线围成的面积?虽然两种情况本质上是一样的,但是还是存在一些细小的区别. 在直角坐标系下中,我们是讨论一条 ...

  3. iframe 中嵌套刷新

    if(top.frames.length>0){top.location.href = window.location.href;}

  4. 让python输出不自行换行的方法

    1,在输出内容后加逗号 例: for i in range(1,6):    j = 1    while(j <= 2*i - 1):        print "*",  ...

  5. ListView 分类: WinForm 2014-07-18 22:03 289人阅读 评论(0) 收藏

    一.ListView类(转载) 1.常用的基本属性: (1)FullRowSelect:设置是否行选择模式.(默认为false) 提示:只有在Details视图该属性才有意义. (2) GridLin ...

  6. 使用JUnit测试java代码

    Junit 单元测试实验报告  一.实验环境 MyEclipse2014.Junit4.10 二.实验目的 学会单元测试,在MyEclipse中进行Junit测试 三.实验步骤 1.写出要测试的类 代 ...

  7. mount命令以及mount ntfs硬盘权限权限与显示的问题 分类: shell ubuntu 2014-11-08 18:29 148人阅读 评论(0) 收藏

    sudo mount -t 文件系统类型 -o 可设置选项 设备路经 访问路经 #常用文件类型如下: iso9660 光驱文件系统, vfat fat/fat32分区, ntfs ntfs分区, sm ...

  8. docker 镜像和容器的批量清理

    镜像和容器的清理 删除所有运行中的容器 $ docker kill $(docker ps -q) 删除所有停止的容器 $ docker rm $(docker ps -a -q) 删除所有没有tag ...

  9. android 57 QQ登录

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools=&q ...

  10. android 11 模拟onclick 事件

    package com.sxt.callback; public class Button { //预存一段按钮点击的响应代码 private OnclickListener mOnClickList ...