《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].[ ...
随机推荐
- Myself
每次过来写博客,一定是遇到什么问题,并且自己还解决不来. 并不是单纯的安静下来书写心得体会-->讨厌之余都有点看不起自己. 闲话少说,回归正题. C语言之于我可是骄傲与挫败并存. 当我做程式遇到 ...
- IE标签a嵌套table标签,链接点击无效
在IE中,使用如下代码将无法触发跳转: <a href="http://xx.xx.com"> <table> <tr> <td>点 ...
- Arcgis Engine - 鹰眼(减少闪烁)
网上看到的代码,都是一个模样,经过不断调试,无意中效果就可以了.主要是在"鼠标拖动的时候",网上的代码的鹰眼效果,感觉坑爹死了,闪烁超级严重.主要原因是鼠标拖动的时候,进行时时更新 ...
- Sql Server导出表结构Excel
SELECT 表名 Then D.name Else '' End, 表说明 Then isnull(F.value,'') Else '' End, 字段序号 = A.colorder, 字段名 = ...
- noip2015运输计划
二分+LCA+查分前缀和 #include<iostream> #include<cstring> #include<cstdio> #include<alg ...
- Sql Server批量停止作业
CREATE Proc [dbo].[Proc_StopJob] as begin declare @I int declare @JobID uniqueidentifier -- 1. creat ...
- sql解释执行顺序
一.查询的逻辑执行顺序 (1) FROM left_table (3) join_type JOIN right_table (2) ON join_condition (4) WHERE where ...
- 原生app,WEBAPP,混合app
什么叫做原生App? 原生App是专门针对某一类移动设备而生的,它们都是被直接安装到设备里,而用户一般也是通过网络商店或者卖场来获取例如 The App Store 与 Android Ap ...
- 棋盘上的距离 - Grids1657
棋盘上的距离 问题描述: 写一个程序,给定起始位置和目标位置,计算王.后.车.象从起始位置走到目标位置所需的最少步数. 王:横.直.斜都可以走,但每步限走一格. 后:横.直.斜都可以走,每步格数不受限 ...
- gcc-gdb
1.使用gdb ,习惯了cgdb ,加上了vim. 调试发现,使用了stl,不知如何查看使用的vector,stack等中的值,来吧.gdb-std-views.下载 1)下载好之后,mv stl-v ...