1.单利模式简单介绍



在《设计模式》中单利模式是一种比較简单的模式,定义例如以下:

确保某一个类仅仅有一个实例,并且自行实例化并向整个系统提供这个实例。

在javascript中则将代码组织为一个单元,这个逻辑单元能够通过一个单一的变量訪问,确保这个对象仅仅存在一份实例。

单体类在javascript中能够用来划分命名空间、降低网页中全局变量的数目。

小结:事实上就是把全部的代码封装到一个类中,訪问时就通过这个类訪问。好比生活中常见的电视遥控。把所须要的操作都封装到遥控上,訪问电视时,直接通过遥控操作就可以。

2.基本结构



我们平时用到的对象字面量就是所谓的单利模式,由于它把一批相关的属性和方法组织到了一起。

<span style="font-family:SimSun;font-size:18px;"> //通过对象字面量的形式来为对象创建属性和方法
var Singleton = {
attribute1: true,
attribute2: 10, //方法一
method1: function () { },
//方法二
method2: function (arg) { }
};
//改动对象属性
Singleton.attribute1 = false;
var total = Singleton.attribute2 + 5;
//读取对象方法
var result = Singleton.method1();</span>

在上述代码中,全部的变量和方法必须通过Singleton对象来訪问,你也能够扩充这个对象。当然这也违背了《设计模式》中的开闭原则,假设真要包括一些私有变量的话,能够採用函数嵌套,也就是闭包的操作。

3.划分命名空间



正如单体对象的定义所看到的:全部单体对象的内部成员都被包装在这个单体对象中,而且这些成员仅仅能通过这些单体对象变量来进行訪问。所以我们寻常所用的命名空间就能够达到这个效果。

<span style="font-family:SimSun;font-size:18px;"> //定义一个全局对象
//定义一个公司的全局对象
var Business = { };
//然后能够分门别类地把自己的代码组织到这个全局对象的各个对象单体中
//公司的管理部
Business.Adminstration = {
//方法一
method1: function () { } };
//公司的运作部
Business.Operation = {
//方法二
method2: function () { }
};
//公司的广告部
Business.advertisement = {
//方法三
method3: function () { }
}; Business.Adminstration.method(); //正确调用
var a = new Business(); //not a constructor
a.Adminstration.method(); //error</span>

通过把处理不同的代码分门别类的做一下规划处理,放到不同的命名空间中,这样就会降低程序的错误。正如上述代码所看到的,首先建立一个公司的全局对象,然后分门别类的把各个部分划分开,职责划分清晰,降低了对象间的联系,降低了出错的可能性。

4.使用闭包



在前面的博客中以前提到有关闭包的概念。在闭包中,把变量和函数定义在构造函数内使他们成为私用成员,而且还定义了一个类似于特权的函数,用来达到外部能够訪问这些私有成员的目的,可是我们知道使用闭包实例化类的时候,全部生命在构造函数内的方法和属性都会再次创建一份,这也是闭包的不利处所在。

由于单体仅仅会被实例化一次,所以你不必操心自己在构造函数内声明了多少方法和属性,由于全部的方法和属性都仅仅会被实例化一次。

<span style="font-family:SimSun;font-size:18px;"> <script>
MyNamespace.Singleton = (function() {
// 私有成员
var privateAttribute1 = false;
var privateAttribute2 = [1, 2, 3]; function privateMethod1() { }
function privateMethod2(args) { }
//闭包
return {
publicAttribute1: true,
publicAttribute2: 10, publicMethod1: function() { },
publicMethod2: function(args) { }
};
})();
</script></span>

通过单体加闭包的操作就能够訪问到对象内部的私有变量了。

5.延迟实例化



因为单体对象都是在脚本载入的时候被创建出来的,假设我们在载入的时候,并不须要单体,那么我们又该怎样操作来推迟单体对象的载入呢?

事实上我们仅仅要在当中增加一个静态的方法,用来声明什么时候调用就可以。

<span style="font-family:SimSun;font-size:18px;"> <script>

        /* 单体对象 */

        MyNamespace.Singleton = (function() {

            var uniqueInstance; // Private attribute that holds the single instance.

            function constructor() { // 详细的代码细节

            }

            return {
/*用来实现延迟载入*/
getInstance: function() {
if(!uniqueInstance) { // 推断仅且仅仅有一个单体对象
uniqueInstance = constructor();
}
return uniqueInstance;
}
}
})(); </script></span>

事实上与上述相比,基本的操作就是多了一个静态的方法,用来实现推断和延迟载入。

6.小结



本篇博客主要解说了单体模式在javascript中的应用,通过运用javascript模式,能够对代码进行组织,把相关的方法和属性组织在一个不被实例化多次的单体中,以方便我们以后的维护。这就是单体模式的优点。

假设还想对单体模式有很多其它了解的话,请详见一下博客。

单例模式

《javascript设计模式》读书笔记四(单例模式)的更多相关文章

  1. JavaScript设计模式 -- 读书笔记

    JavaScript设计模式 一. 设计模式 一个模式就是一个可重用的方案: 有效的解决方法.易重用.善于表达该解决方案: 未通过"模式特性"测试的模式称为模式原型: 三规则:适用 ...

  2. JavaScript设计模式:读书笔记(未完)

    该篇随我读书的进度持续更新阅读书目:<JavaScript设计模式> 2016/3/30 2016/3/31 2016/4/8 2016/3/30: 模式是一种可复用的解决方案,可用于解决 ...

  3. JavaScript设计模式读书笔记之一:接口

    接口 在JavaScrip中模仿接口 用注释描述接口 用属性检查模仿接口 用鸭式辨型模仿接口 依赖于接口的设计模式 工厂模式 组合模式 装饰者模式 命令模式 接口 在JavaScrip中模仿接口 用注 ...

  4. HeadFirst设计模式读书笔记(5)-单例模式

    单例模式:确保一个类只有一个实例,并提供一个全局访问点. 应用场景:数据库连接.线程池.缓存.对话框.处理偏好设置.注册表的对象.日志对象.充当打印机.显卡等设备的驱动程序对象.任务管理器.网站的计数 ...

  5. JavaScript设计模式样例四 —— 单例模式

    单例模式(Singleton Pattern): 定义:保证一个类仅有一个实例,并提供一个访问它的全局访问点. 目的:阻止其他对象实例化其自己的单例对象的副本,从而确保所有对象都访问唯一实例. 场景: ...

  6. 《你不知道的javascript》读书笔记2

    概述 放假读完了<你不知道的javascript>上篇,学到了很多东西,记录下来,供以后开发时参考,相信对其他人也有用. 这篇笔记是这本书的下半部分,上半部分请见<你不知道的java ...

  7. 《编写可维护的javascript》读书笔记(中)——编程实践

    上篇读书笔记系列之:<编写可维护的javascript>读书笔记(上) 上篇说的是编程风格,记录的都是最重要的点,不讲废话,写的比较简洁,而本篇将加入一些实例,因为那样比较容易说明问题. ...

  8. HeadFirst设计模式读书笔记--目录

    HeadFirst设计模式读书笔记(1)-策略模式(Strategy Pattern) HeadFirst设计模式读书笔记(2)-观察者模式(Observer Pattern) HeadFirst设计 ...

  9. 【转】Verilog HDL常用建模方式——《Verilog与数字ASIC设计基础》读书笔记(四)

    Verilog HDL常用建模方式——<Verilog与数字ASIC设计基础>读书笔记(四) Verilog HDL的基本功能之一是描述可综合的硬件逻辑电路.所谓综合(Synthesis) ...

  10. 【转载】MDX Step by Step 读书笔记(四) - Working with Sets (使用集合)

    1. Set  - 元组的集合,在 Set 中的元组用逗号分开,Set 以花括号括起来,例如: { ([Product].[Category].[Accessories]), ([Product].[ ...

随机推荐

  1. ssh(安全外壳层)

    SSH 为 Secure Shell 的缩写,由 IETF 的网络小组(Network Working Group)所制定:SSH 为建立在应用层基础上的安全协议.SSH 是目前较可靠,专为远程登录会 ...

  2. 无法将匿名方法转换为System.Delegate

    在WinForm中,不允许非UI线程访问UI,如果非UI线程需要跨线程调用UI控件,通常的解决办法是使用Control类中的Invoke方法,传递给该方法一个委托和委托调用的参数列表(params [ ...

  3. thinkphp URL相关

    具体详见tp文档. 此处仅做学习笔记. 后缀配置: // 模板文件后缀名 'TMPL_TEMPLATE_SUFFIX'=>'.html', // 伪静态文件后缀名 'URL_HTML_SUFFI ...

  4. java 实现视频转换通用工具类:获取视频元数据信息(一)

    java 做视频转换主要用到开源的ffmpeg或者mencoder,还要有MP4Box. 注:由于平时都没有时间写博客,所以思路我就不写了,有问题问我,不一定马上回复. 详细介绍: ffmpeg:ht ...

  5. JavaScript入门(6)

    一.if语句 if语句是基于条件成立才执行相应代码时使用的语句 语法: if(条件) {条件成立时执行代码} 注: if小写,大写字母IF会出错! 二.if...else语句(二选一) 语法: if( ...

  6. mysql添加超级管理员

    mysql>create user 'myroot'@'localhost' identified by 'myroot'; mysql>grant all privileges on * ...

  7. Java面试题之数据库三范式是什么

    为了建立冗余较小.结构合理的数据库,设计数据库时必须遵循一定的规则.在关系型数据库中这种规则就称为范式.范式是符合某一种设计要求的总结.要想设计一个结构合理的关系型数据库,必须满足一定的范式. 在实际 ...

  8. 【C++基础】类的组合

    所谓类的组合是指:类中的成员数据是还有一个类的对象或者是还有一个类的指针或引用.通过类的组合能够在已有的抽象的基础上实现更复杂的抽象. 比如: 1.按值组合 #include<iostream. ...

  9. 证明与计算(2): 离散对数问题(Discrete logarithm Problem, DLP)

    离散对数问题,英文是Discrete logarithm Problem,有时候简写为Discrete log,该问题是十几个开放数学问题(Open Problems in Mathematics, ...

  10. org.apache.jasper.JasperException:Unable to read TLD &quot;META-INF/c-1_0-rt.tld&quot; from JAR file jstl-1.2.jar

    前两天把项目从eclipse EE版搬到MyEclipse中了.配置好jdk,确定build path中没有报错后,在tomcat中运行.结果,报错: org.apache.jasper.Jasper ...