Javascript 设计模式 -- Singleton(单例)模式
2015-01-03 15:59
309 查看
从经典意义上来说
Singleton模式,在该实例不存在的情况下,可以通过一个方法创建一个类来实现创建类的新实例;如果实例已经存在,它会简单返回该对象的引用。Singleton不同于静态类,因为我们可以推迟他们的初始化。var mySingleton = (function() { var instance; function init() { function privateMethod() { console.log("i am private"); } var privateVariable = "i am also private"; var privateRandomNumber = Math.random(); return { publickMethod: 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()); console.log(singleB.getRandomNumber()); console.log(singleA.getRandomNumber() === singleB.getRandomNumber()); // true console.log("\n"); var badSingleA = myBadSingleton.getInstance(); var badSingleB = myBadSingleton.getInstance(); console.log(badSingleA.getRandomNumber()); console.log(badSingleB.getRandomNumber()); console.log(badSingleA.getRandomNumber() === badSingleB.getRandomNumber()); // false
Singleton模式的适用性描述如下:
1、当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时。
2、该唯一的实例应该是通过子类化可扩展的,并且客户应该无需要改代码就能使用一个扩展的实例。
在实践中
var SingletonTester = (function() { function Singleton( options ) { options = options || { }; this.name = "SingletonTester"; this.pointX = options.pointX || 6; this.pointY = options.pointY || 10; } var instance; var _static = { name: "SingletonTester", getInstance: function ( options ) { console.log(instance + "\n"); if ( instance === undefined ) { instance = new Singleton( options ); } return instance; } }; return _static; })(); var test1 = SingletonTester.getInstance({pointX: 15}); console.log(test1); console.log("\n"); var test2 = SingletonTester.getInstance({pointX: 7}); console.log(test2);
结果如图:
相关文章推荐
- JavaScript 设计模式系列 : 单例(Singleton)模式
- javascript设计模式:单例模式(Singleton)
- javascript 设计模式之单体(Singleton)模式
- javascript设计模式之单例(singleton)模式
- Javascript 设计模式 - Singleton
- Javascript 设计模式学习之三 Singleton(单例)模式
- javascript中Singleton设计模式的实现
- JavaScript演示下Singleton设计模式
- JavaScript 设计模式学习 Singleton
- 设计模式---单子(Singleton)
- 设计模式之单件(Singleton)的应用
- 在Java中应用设计模式--Singleton
- 设计模式、用Delphi实现---->Singleton 模式
- 设计模式之Singleton(单态)
- 设计模式笔记之 - Singleton & Monostate
- 设计模式之Singleton
- 设计模式-->Singleton(单例模式)
- 设计模式单件(Singleton)---对象创建型模式
- 设计模式之Singleton(单态)