单件是JavaScript中最基本、最有用的设计模式,而你今后也会经常的使用这个模式。通过单件,我们可以把统一到一个逻辑单元中并且提供一个唯一的入口,这就保证你所有的引用都是用的这个全局资源。

单件的用途有:一、提供一个Namespacing、二、提供一种被称为branching的技术。

单件的基本形式:

/* Basic Singleton Pattern */

var Map = {

name:"Map G",

createdate:"2008-09-19",

sayMyName:function(){

alert("My Name is " + this.name);

},

tellMeWords:function(arg){

alert("What you told to me is " + arg + "\n I won't tell anyone!")

}

}

命名空间:

我们可以给单件提供新的属性,并且能够创建独立的命名空间,而避免我们写的属性或者程序被无意的覆盖。我们接着单件的基本形式中的例子可以创建新的属性:

Map.Property = {

createdata:"2000-09-09",

width:"100",

height:"200"

}

Map.Utility = {

getSize:function(x,y){

return x*y;

}

}

这样,同样的createdate属性即便一样,也不会造成程序中的冲突了。

在单件中添加私有成员:

利用下划线。最简单、最直接的声明私有变量的方式就是使用下划线。这样就可以使其他程序员明白,这些变量是私有的、只是在对象内部使用,同时也可以使其他程序员避免直接访问他们。

/* Basic Singleton Pattern */

var Map = {

name:"Map G",

createdate:"2008-09-19",

sayMyName:function(){

alert("My Name is " + this.name);

},

tellMeWords:function(arg){

alert("What you told to me is " + arg + "\n I won't tell anyone!")

},

_isMature:function(){

alert("Of Course, I'm Mature!");

}

}

使用Closure。

使用Closure,我们可以实现私有变量和共有变量。因为singleton在调用过程中只会有一个实例,所以我们就不必担心私有成员耗费资源的问题了。例子如下:

MyNamespace = {};

MyNamespace.Singleton = (function(){

var privateAttribute1 = "Name";

var privateAttribute2 = true;

function privateMethod1(){

}

return {

publicAttribute1:"Public",

publicAttribute2:"false",

publicMethod1:function(){

}

};

})();

Lazy Instantiation

以上所讨论的各种各样的单件实现,他们都有一个共同点,那就是当代码加载时就立即创建的。如果你有一个需要复杂配置的单件、或者他加载的时候需要占用大量资源,也许我们就该考虑延时实现他了。Lazy Loading就是用来解决这个问题的,常被用在需要加载大量数据的时候。

Lazy Loading singletons与之前的singleton不同,你不能通过MyNamespace.methdName()来进行访问,而必须通过Mynamespace.getInstance().methodName()来访问。GetInstance方法首先检查单件是否进行实例化,如果没有,则创建并返回,下面是例子:

//Lazy instantiation

Car = {};

Car.MyPorsche = (function(){

var uniqueInstance;

function CarOfPorsche(){

var name = "My Favorate Porsche";

var buydate = "2008-09-22";

return {

speed:"120Kmp",

getName:function(){

return name;

}

};

}

return {

getInstance:function(){

if(!uniqueInstance){

uniqueInstance = CarOfPorsche();

}

return uniqueInstance;

}

};

})();

//Normal Singleton

Car.MyBenz = (function(){

var name = "My Benz Car";

var buydate = "2009-10-10";

return {

speed:"140Kmp",

getName:function(){

return name;

}

};

})();

Lazy loading的一个缺点是增加了代码的复杂性,而且代码开始变得难以理解。在调用的时候,我们需要通过Car.MyPorsche.getInstance().speed来调用,这就增加了代码的复杂行。当然,我们可以通过

var porsche = Car.MyPorsche.getInstance();

alert(porsche.getName() + "'s speed is " + porsche.speed);

来简化调用。

分支(Branching):

分支是一项将不同浏览器的区别封装到动态方法中的技术。我们以创建XHR对象为例。对于大多数浏览器,XHR 是XMLHttpRequest对象的一个实例,或者是较早版本的IE的不同ActiveX的一个实例。这个方法总是伴随着对于浏览器的检测,如果我们没用用Branching这项技术,没次我们都需要运行浏览器检测的方法来检查,这降低了代码的效率。

一个更加高效的方式就是当代码加载时,根据浏览器的不同赋予一个固定的值,在不同的浏览器下,我们只执行这个实现的扩展。在运行时刻动态改变一个Function的内容,这正是JavaScript灵活的强大的所在。

那么分支如何应用在单件中呢,看下面的例子:

//Branching

//SimpleXhrFactory Singleton

var SimpleXhrFactory = (function(){

var standard = {

createObject:function(){

return new XMLHttpRequest();

}

};

var activexNew = {

createObject:function(){

return new ActiveXObject("Msxml2.XMLHTTP");

}

};

var activexOld = {

createObject:function(){

return new ActiveXObject("Microsoft.XMLHTTP");

}

};

var testObject;

try{

testObject = standard.createObject();

return standard;

}catch(e){

try{

testObject = activexNew.createObject();

return activexNew;

}catch(e){

try{

testObject = activexOld.createObject();

return activexOld;

}catch(e){

throw new Error("No XMLHTTP Object found in this environment!");

}

}

}

})();

什么时候使用单件:

当需要使用命名空间或者模块化你的代码的时候,应该尽量的使用单件。单件是JavaScript中使用最广泛的一个设计模式,无论在什么规模的项目中,你都能看到他的影子。

使用单件的好处:

单件的主要作用是提供了一个格式化你的代码的方法。通过吧相似的方法和属性集合到一个单间中,并且只能被实例化一次,你就可以更方便的调试代码。

转载于:https://www.cnblogs.com/cocowool/archive/2008/09/23/1296594.html

JavaScript设计模式学习(四)单件(Singleton Pattern)相关推荐

  1. C#设计模式之一单例模式(Singleton Pattern)【创建型】

    一.引言 看了李建忠老师的讲的设计模式已经有一段时间了(这段时间大概有一年多了),自己还没有写过自己的.有关设计模式的文章.这次想写一些关于设计模式的文章,用自己的理解和代码来写,算是复习一遍.写作的 ...

  2. Net设计模式实例之单例模式( Singleton Pattern)

    一.单例模式简介(Brief Introduction) 单例模式(Singleton Pattern),保证一个类只有一个实例,并提供一个访问它的全局访问点.单例模式因为Singleton封装它的唯 ...

  3. JavaScript设计模式系列四之外观模式(附案例源码)

    文章初衷 设计模式其实旨在解决语言本身存在的缺陷, 目前javaScript一些新的语法特性已经集成了一些设计模式的实现, 大家在写代码的时候,没必要为了用设计模式而去用设计模式, 那么我这边为什么还 ...

  4. 设计模式学习之单件模式singleton

    定义 单件模式是一种用于确保整个应用程序中只有一个类实例且这个实例所占资源在整个应用程序中是共享的程序设计方法(根据实际情况,可能需要几个类实例).在某些情况下,这种程序设计方法是很有用处的. 单件模 ...

  5. C#面向对象设计模式第二讲:Singleton Pattern单件模式(创建型模式)

    (根据MSDN Webcast相关课程整理) 模式分类: 从目的来看: 创建型(Creational):负责对象的创建 结构型(Structural):处理类与对象间的组合 行为型(Behaviora ...

  6. JavaScript设计模式学习——builder pattern(建造者模式)

    个人理解的应用场景 举个例子,比如想要创建各种类型的车的实例,车的类型有很多种,但创建每种类型车的接口定义可能是一样的,就用到了此模式 相关概念的通俗解释 上述例子中接口的定义叫builder 接口到 ...

  7. java设计模式学习 ----- 单例模式(Singleton)

    单例模式(Singleton) 单例对象(Singleton)是一种经常使用的设计模式. 在Java应用中,单例对象能保证在一个JVM中,该对象仅仅有一个实例存在.单例模式也分三种:懒汉式单例.饿汉式 ...

  8. JavaScript设计模式 Item 6 --单例模式Singleton

    单例模式的定义:保证一个类仅有一个实例,并提供一个访问它的全局访问点. 单例模式是一种常用的模式,有一些对象我们往往只需要一个,比如线程池.全局缓存.浏览器的window对象.在js开发中,单例模式的 ...

  9. JavaScript 设计模式学习第九篇- 抽象工厂模式

    工厂模式 (Factory Pattern),根据输入的不同返回不同类的实例,一般用来创建同一类对象.工厂方式的主要思想是将对象的创建与对象的实现分离. 抽象工厂 (Abstract Factory) ...

最新文章

  1. awk脚本打印终端各种颜色的字体
  2. 基于SSM实现宠物商城系统
  3. Android Binder 学习笔记
  4. Lesson 16.1016.1116.1216.13 卷积层的参数量计算,1x1卷积核分组卷积与深度可分离卷积全连接层 nn.Sequential全局平均池化,NiN网络复现
  5. 程序员一定要提升技术之外的能力
  6. Spring Boot与RESTful API
  7. linux几种常见的文件内容查找和替换命令
  8. ubuntu16.04下出现登陆不进去
  9. OpenAI API 案例
  10. 【python】list,dict赋值不要用等号,要用extend,update
  11. [转载]git 设置第一次输入密码之后不用输入密码
  12. 2009无线通信五大趋势 3G范围将覆盖全球
  13. 页面加载之window.onload=function(){} 和 $(function(){})的区别
  14. 红linux系统,红帽子linux系统
  15. Android获取mp3音频文件总播放时长大小
  16. 小米路由器3无线网连接到服务器,小米路由器3无线中继(桥接)怎么设置?
  17. UOJ449 集训队作业2018 喂鸽子
  18. android 页面回滚焦点位置 解决方案
  19. linux自动清除超出的文件,Linux下面自动清理超过指定大小的文件
  20. 蚂蚁金服首席数据科学家漆远:AI技术开放,与业界融合共创

热门文章

  1. 黑马程序员_JAVA之IO流(其他IO流)
  2. sp_server_diagnostics
  3. 速看: 加解密、加签验签,你想要的都在这了
  4. 四川麻将出现天胡与地胡的概率
  5. Linux下的通信时延测试程序
  6. 操作系统 - 处理机调度仿真
  7. 北风:美团饿了么外卖返利cps项目是什么做的?(实操)
  8. 图形图像处理案例1——蚊香画生成器
  9. 少年歌行游戏一直显示连接服务器,少年歌行出现第三方登陆失败怎么办 解决方案一览...
  10. 《汇编语言》王爽(第四版)第八章 实验7