《javascript设计模式》读书笔记四(单例模式)
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设计模式》读书笔记四(单例模式)的更多相关文章
- JavaScript设计模式 -- 读书笔记
JavaScript设计模式 一. 设计模式 一个模式就是一个可重用的方案: 有效的解决方法.易重用.善于表达该解决方案: 未通过"模式特性"测试的模式称为模式原型: 三规则:适用 ...
- JavaScript设计模式:读书笔记(未完)
该篇随我读书的进度持续更新阅读书目:<JavaScript设计模式> 2016/3/30 2016/3/31 2016/4/8 2016/3/30: 模式是一种可复用的解决方案,可用于解决 ...
- JavaScript设计模式读书笔记之一:接口
接口 在JavaScrip中模仿接口 用注释描述接口 用属性检查模仿接口 用鸭式辨型模仿接口 依赖于接口的设计模式 工厂模式 组合模式 装饰者模式 命令模式 接口 在JavaScrip中模仿接口 用注 ...
- HeadFirst设计模式读书笔记(5)-单例模式
单例模式:确保一个类只有一个实例,并提供一个全局访问点. 应用场景:数据库连接.线程池.缓存.对话框.处理偏好设置.注册表的对象.日志对象.充当打印机.显卡等设备的驱动程序对象.任务管理器.网站的计数 ...
- JavaScript设计模式样例四 —— 单例模式
单例模式(Singleton Pattern): 定义:保证一个类仅有一个实例,并提供一个访问它的全局访问点. 目的:阻止其他对象实例化其自己的单例对象的副本,从而确保所有对象都访问唯一实例. 场景: ...
- 《你不知道的javascript》读书笔记2
概述 放假读完了<你不知道的javascript>上篇,学到了很多东西,记录下来,供以后开发时参考,相信对其他人也有用. 这篇笔记是这本书的下半部分,上半部分请见<你不知道的java ...
- 《编写可维护的javascript》读书笔记(中)——编程实践
上篇读书笔记系列之:<编写可维护的javascript>读书笔记(上) 上篇说的是编程风格,记录的都是最重要的点,不讲废话,写的比较简洁,而本篇将加入一些实例,因为那样比较容易说明问题. ...
- HeadFirst设计模式读书笔记--目录
HeadFirst设计模式读书笔记(1)-策略模式(Strategy Pattern) HeadFirst设计模式读书笔记(2)-观察者模式(Observer Pattern) HeadFirst设计 ...
- 【转】Verilog HDL常用建模方式——《Verilog与数字ASIC设计基础》读书笔记(四)
Verilog HDL常用建模方式——<Verilog与数字ASIC设计基础>读书笔记(四) Verilog HDL的基本功能之一是描述可综合的硬件逻辑电路.所谓综合(Synthesis) ...
- 【转载】MDX Step by Step 读书笔记(四) - Working with Sets (使用集合)
1. Set - 元组的集合,在 Set 中的元组用逗号分开,Set 以花括号括起来,例如: { ([Product].[Category].[Accessories]), ([Product].[ ...
随机推荐
- 数据持久化之CoreData
再次回归博客园, 已经实属不易了, 面临这近期忙忙碌碌的项目开发, 虽然并不是完全的没有闲暇时间, 但是怎么说呢, 也有着各种的无奈与曲折, 面临这产品需求的不断变化和页面的不断更新, 对于一个程序员 ...
- Java基础知识强化50:运行javac 报告javac不是内部或外部命令(已解决)
1. 问题:运行javac 报告javac不是内部或外部命令,但是运行java.java-version正常 ? 看看下面三个环境变量是否设置正确: (1)环境变量 JAVA_HOME 设置JAVA ...
- XML的DOM、SAX、DEMO4J及DEMO4J整合Path的代码例子
1.DMO解析 package cn.itcast.xml.dom; import java.io.File; import javax.xml.parsers.DocumentBuilder; im ...
- ZCTF-Restaurant-Pwn500
版权声明:本文为博主原创文章,未经博主允许不得转载. 这道压轴的题也是名副其实,很有分量.这也是自己第二次做C++类型的PWN.含有两个漏洞,缺一不可,一个漏洞将指定位置覆盖为对象虚表的地址,另外一个 ...
- Vi操作技巧
Vi操作技巧: :nu 显示当前所在行的行号 :set nu 显示全部行号 :set nonu 取消显示行号 /字符串 查询字符串,按n查询下一个,按N查询上一个 持续 ...
- DNN7网站系统需求及部署指南详解
此安装指南适用于DNN6.x和DNN7.x在本地测试及主机的安装.最近QQ群里不少朋友问我关于DotNetNuke的安装和运行的问题. 为了让大家更清楚地了解DNN的安装方式,我在这里对DotNetN ...
- 什么是 Terminal
从用户的角度来看,Terminal 是键盘和显示器的组合,也称为 TTY(电传打字机的缩写).键盘输入字符,显示器显示字符. 从进程的角度来看,终端是字符设备,可以通过 read.write.ioct ...
- [Mugeda HTML5技术教程之8]添加行为
上一节我们已经在新建的作品中添加了元素和动画,如果我们想要作品能够和用户互动,就需要给元素添加动作行为.在舞台上选中一个要添加动作的元素,在属性栏的动作下拉列表中选择一个动作.可选类别有链接.表单.行 ...
- php魔术方法——构造函数和析构函数
php有一类很神奇的方法,这些方法是保留方法,通常不会在外部被显式调用,他们使用双下划线(__)开头,他们被称为魔术方法(Magic Methods).php官方也不建议定义其他双下划线开头的方法. ...
- JQuery实现隔行变色和突出显示当前行 效果
运行效果如下图: jquery关键代码: <script type="text/javascript"> //该文件为:js.js // 当鼠标移到表格上是,当前一行背 ...