JavaScript学习记录——《学用 JavaScript 设计模式》学习笔记(2)单例模式
来源:互联网 发布:e4a连接数据库 编辑:程序博客网 时间:2024/06/08 03:33
单例模式
在JavaScript语言中, 单例服务作为一个从全局空间的代码实现中隔离出来共享的资源空间是为了提供一个单独的函数访问指针。
我们能像这样实现一个单例:
var mySingleton = (function () { // Instance stores a reference to the Singleton var instance; function init() { // 单例 // 私有方法和变量 function privateMethod(){ console.log( "I am private" ); } var privateVariable = "Im also private"; var privateRandomNumber = Math.random(); return { // 共有方法和变量 publicMethod: function () { console.log( "The public can see me!" ); }, publicProperty: "I am also public", getRandomNumber: function() { return privateRandomNumber; } }; }; return { // 如果存在获取此单例实例,如果不存在创建一个单例实例 getInstance: function () { if ( !instance ) { instance = init(); } return instance; } };})();var myBadSingleton = (function () { // 存储单例实例的引用 var instance; function init() { // 单例 var privateRandomNumber = Math.random(); return { getRandomNumber: function() { return privateRandomNumber; } }; }; return { // 总是创建一个新的实例 getInstance: function () { instance = init(); return instance; } };})();// 使用:var singleA = mySingleton.getInstance();var singleB = mySingleton.getInstance();console.log( singleA.getRandomNumber() === singleB.getRandomNumber() ); // truevar badSingleA = myBadSingleton.getInstance();var badSingleB = myBadSingleton.getInstance();console.log( badSingleA.getRandomNumber() !== badSingleB.getRandomNumber() ); // true
在四人帮(GoF)的书里面,单例模式的应用描述如下:
1、每个类只有一个实例,这个实例必须通过一个广为人知的接口,来被客户访问。
2、子类如果要扩展这个唯一的实例,客户可以不用修改代码就能使用这个扩展后的实例。
关于第二点,可以参考如下的实例,我们需要这样编码:
mySingleton.getInstance = function(){ if ( this._instance == null ) { if ( isFoo() ) { this._instance = new FooSingleton(); } else { this._instance = new BasicSingleton(); } } return this._instance;};
区分类的静态实例和单例模式很重要:尽管单例模式可以被实现成一个静态实例,但是单例可以懒构造,在真正用到之前,单例模式不需要分配资源或者内存。
如果我们有个静态对象可以被直接初始化,我们需要保证代码总是以同样的顺序执行(例如 汽车需要轮胎先初始化)当你有很多源文件的时候,这种方式没有可扩展性。
单例模式和静态对象都很有用,但是不能滥用-同样的我们也不能滥用其它模式。
在实践中,当一个对象需要和另外的对象进行跨系统协作的时候,单例模式很有用。
下面是一个单例模式在这种情况下使用的例子:
var SingletonTester = (function () { // options: an object containing configuration options for the singleton // e.g var options = { name: "test", pointX: 5}; function Singleton( options ) { // set options to the options supplied // or an empty object if none are provided options = options || {}; // set some properties for our singleton this.name = "SingletonTester"; this.pointX = options.pointX || 6; this.pointY = options.pointY || 10; } // our instance holder var instance; // an emulation of static variables and methods var _static = { name: "SingletonTester", // Method for getting an instance. It returns // a singleton instance of a singleton object getInstance: function( options ) { if( instance === undefined ) { instance = new Singleton( options ); } return instance; } }; return _static;})();var singletonTest = SingletonTester.getInstance({ pointX: 5});// Log the output of pointX just to verify it is correct// Outputs: 5console.log( singletonTest.pointX );
尽管单例模式有着合理的使用需求,但是通常当我们发现自己需要在javascript使用它的时候,这是一种信号,表明我们可能需要去重新评估自己的设计。
这通常表明系统中的模块要么紧耦合要么逻辑过于分散在代码库的多个部分。单例模式更难测试,因为可能有多种多样的问题出现,例如隐藏的依赖关系,很难去创建多个实例,很难清理依赖关系,等等。
《学用 JavaScript 设计模式》学习资料来源,感谢各位专家们的翻译!
http://www.oschina.net/translate/learning-javascript-design-patterns
0 0
- JavaScript学习记录——《学用 JavaScript 设计模式》学习笔记(2)单例模式
- JavaScript学习记录——《学用 JavaScript 设计模式》学习笔记(3)观察者模式
- JavaScript学习记录——《学用 JavaScript 设计模式》学习笔记(1)
- javascript学习(9)——[设计模式]单例
- 【学习笔记javascript设计模式与开发实践(单例模式)----4】
- 【学习笔记javascript设计模式与开发实践(单例模式)----4】
- 设计模式——单例模式(学习笔记)
- 设计模式学习笔记—单例模式(Singleton)
- JavaScript设计模式学习笔记
- JavaScript设计模式学习之单例模式
- JavaScript设计模式学习笔记2
- JavaScript设计模式学习笔记:单体模式
- 《从零开始学Swift》学习笔记(Day 63)——Cocoa Touch设计模式及应用之单例模式
- 设计模式学习笔记——单例模式
- 设计模式学习笔记——单例模式
- 设计模式学习笔记——单例模式
- 设计模式学习笔记——单例模式
- 设计模式:学习笔记(1)——单例模式
- 【写给程序员】请不要做浮躁的人
- HDU 3068 最长回文(manacher算法:回文字串)
- php面试题集-数据库技术题
- 使用冒泡排序讲解函数指针
- php面试题集-综合技术题
- JavaScript学习记录——《学用 JavaScript 设计模式》学习笔记(2)单例模式
- php面试题集-前端技术题
- 深度学习(Deep Learning,DL)的相关资料总结
- C与C++混合编程
- 一个较完整的IPhone秒表程序
- 关于Qrcode和zxing的一些看法
- 超快速编写ejb3.0的实体bean
- Python3.2官方文档教程--其余参数形式
- 反向LL(1)预测分析法的简易C++四则表达式计算