读书笔记之 - javascript 设计模式 - 单体模式
单体是一个用来划分命名空间,并将一批相关方法和属性组织在一起的对象,如果它可以被实例化,那么它只能被实例化一次。
单体模式,就是将代码组织为一个逻辑单元,这个逻辑单元中的代码可以通过单一的变量进行访问。
单体基本结构是这样:
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 设计模式 - 单体模式的更多相关文章
- 读书笔记之 - javascript 设计模式 - 代理模式
代理(proxy)是一个对象,它可以用来控制对另一对象的访问.它与另外那个对象实现了同样的接口,并且会把任何方法调用传递给那个对象.另外那个对象通常称为本体.代理可以代替本体被实例化,并使其可被远程访 ...
- 读书笔记之 - javascript 设计模式 - 门面模式
门面模式有俩个作用: 简化类的接口 消除类与使用它的客户代码之间的耦合 在javascript中,门面模式常常是开发人员最亲密的朋友.它是几乎所有javascript库的核心原则,门面模式可以使库提供 ...
- 读书笔记之 - javascript 设计模式 - 工厂模式
一个类或者对象中,往往会包含别的对象.在创建这种对象的时候,你可能习惯于使用常规方式,即用 new 关键字和类构造函数. 这会导致相关的俩个类之间产生依赖. 工厂模式,就是消除这俩个类之间的依赖性的一 ...
- 读书笔记之 - javascript 设计模式 - 命令模式
本章研究的是一种封装方法调用的方式.命令模式与普通函数有所不同.它可以用来对方法调用进行参数化处理和传送,经过这样处理过的方法调用可以在任何需要的时候执行. 它也可以用来消除调用操作的对象和实现操作的 ...
- 读书笔记之 - javascript 设计模式 - 组合模式
组合模式是一种专为创建Web上的动态用户界面而量身定制的模式,使用这种模式,可以用一条命令在对各对象上激发复杂的或递归的行为. 在组合对象的层次体系中有俩种类型对象:叶对象和组合对象.这是一个递归定义 ...
- JavaScript设计模式——单体模式
一:单体模式简介: 是什么:将代码组织为一个逻辑单元,这个单元中的代码通过单一的变量进行访问.只要单体对象存在一份实例,就可以确信自己的所有代码使用的是同样的全局资源. 用途:1.用来划分命名空间,减 ...
- javascript设计模式-单体模式
场景:假设有一个Girl(美女)实体,该实体拥有姓名.年龄两个属性,拥有显示姓名和洗澡两个方法,下面分步骤构造该实体. 1.用简单基本单体模式: var Girl1 = { name:"昭君 ...
- 读书笔记之 - javascript 设计模式 - 享元模式
本章探讨另一种优化模式-享元模式,它最适合于解决因创建大量类似对象而累及性能的问题.这种模式在javascript中尤其有用,因为复杂的javascript代码很快就会用光浏览器的所有可用内存,通过把 ...
- 读书笔记之 - javascript 设计模式 - 责任链模式
责任链模式可以用来消除请求的发送者和接收者之间的耦合.这是通过实现一个由隐式地对请求进行处理的对象组成的链而做到的.链中的每个对象可以处理请求,也可以将其传给下一个对象. 责任链的结构: 责任链由多个 ...
随机推荐
- VisualBox ubuntu14.04 64位 android4.4.4源码编译总结
转载请保留出处:http://www.cnblogs.com/wi100sh/p/4337907.html 折腾了好几天,今天终于编译通过,用了4个多小时,太不容易了.如下图所示: 软件环境 虚拟机: ...
- 笔记-人老了-github
其实GITHUB是很不错的,虽然之前的JD泄露那件事情,后果很严重. 但是作为个人使用很不错的. github使用入门: 1:申请一个帐号 2:github使用ssh推送的.(ssh走的是加密) 所以 ...
- winphone 开发学习笔记(2)
导航 NavigationService.Navigate(new Uri("xxxx.xaml",UriKind.Relative)) xxx表示要跳转的目标页面 页面和页面导航 ...
- Unity5 Screen-Space Subsurface Scattering屏幕空间次表面散射SSSSS
用unity5自带的standard shader ------------by wolf96
- http 协议的过程
当你输入某个网址的时候发生了什么? 首先:你该知道 a.http协议是应用层协议,他是浏览器像服务器请求网页,服务器返回网页的过程,他是基于tcp协议的. 1.假设随便输入输入域名 http://ww ...
- Android学习之 sildingmenu
仿SlidingMenu Android抽屉菜单效果drawer menu - appdoll.com Android "多方向"抽屉 - 开源中国社区 自定义Android滑动式 ...
- Java 23种设计模式详尽分析与实例解析之二--结构型模式
Java设计模式 结构型模式 适配器模式 模式动机:在软件开发中采用类似于电源适配器的设计和编码技巧被称为适配器模式.通常情况下,客户端可以通过目标类的接口访问它所提供的服务.又是,现有的类可以满足客 ...
- 免费WiFi,仅仅为好久没联系的你们
昨日,认识五年的朋友搬来与我一起住了,说不上来,没有激动,仅仅是突然感觉生活又多了一点生机.兴致上来,晚上立马联系了已经近四个月没有联系的好友,才知道他们的生活也因这几个月发生了翻天覆地的变化.究竟什 ...
- MVC ASPX(webForm)视图引擎 <%:%> 与<%=%>的差别
控制器 using System; using System.Collections.Generic; using System.Linq; using System.Web; using Syste ...
- 《Android群英传》读书笔记 (5) 第十一章 搭建云端服务器 + 第十二章 Android 5.X新特性详解 + 第十三章 Android实例提高
第十一章 搭建云端服务器 该章主要介绍了移动后端服务的概念以及Bmob的使用,比较简单,所以略过不总结. 第十三章 Android实例提高 该章主要介绍了拼图游戏和2048的小项目实例,主要是代码,所 ...