标签:
singleton(单例)模式被熟知的原因是因为它限制了类的实例化次数只能一次,单例模式,在该实例不存在的勤快下,可以通过一个方法创建一个类来实现创建类的新实例;如果实例已经存在,则会简单返回该对象的引用。单例模式不同于静态类(或对象),因为我们可以推迟它们的初始化,这通常是因为它需要一些信息,而这些信息在初始化期间可能无法获取,对于没有察觉到之前的引用代码,它们不会提供方便检索方法,这是因为它既不是对象,也不是由一个single返回的类,而是一个结构,在js中,singleton充当共享资源命名空间,从全局命名空间中隔离出代码实现,从而函数提供单一访问点。
var mySingleton = (function () {
//实例保持了singleton的一个引用
var instacnce;
function init() {
//私有方法和变量
funciton privateMethod(){
//...
}
var privateVariable = "private";
var privateRandomNumber = Math.random();
/*这里定义单例代码*/
return {
//公有方法和变量
publicMethod: function () {
console.log(‘hello world‘);
},
publicProperty: ‘test‘,
getRandomNumber:function(){
return privateRandomNumber;
}
};
}
return {
//获取singleton的实例,如果存在就返回,不存在创建新的实例
getInstance: function () {
if (!instance) {
instance= init();
}
return instance;
}
};
})();
/*调用公有的方法来获取实例:*/
mySingleton .getInstance().publicMethod();
singleton模式适用性:
当唯一的实例应该是通过子类化可扩展的,并且客户应该无需要更改代码就能使用一个扩展的实例时。
类的静态实例和singleton之间的区别:当singleton可以作为一个静态的实例实现时,它可以延迟构建,直到需要使用静态实例时,无需使用资源和内存。
如果我们有一个可以直接被初始化的静态对象,需要确保执行代码顺序总是相同,当我们有大量的源文件时,它并不能伸缩。
在实践中,当在系统中确实需要一个对象来协调其他对象时,singleton模式是很有用的。
var SingletonTester = (function () {
//参数:传递给单例的一个参数集合
function Singleton(options) {
//设置options变量为接收的参数或者为空(如果没有提供的话)
options= options|| {};
//设置name参数
this.name = ‘SingletonTester‘;
//设置pointX的值
this.pointX = options.pointX || 6; //从接收的参数里获取,或者设置为默认值
//设置pointY的值
this.pointY = options.pointY || 10;
}
//实例容器
var instance;
//静态变量和方法模拟
var _static = {
name: ‘SingletonTester‘,
//获取实例的方法
//返回Singleton的实例
getInstance: function (options) {
if (instance === undefined) {
instance = new Singleton(options);
}
return instance;
}
};
return _static;
})();
var singletonTest = SingletonTester.getInstance({ pointX: 5 });
console.log(singletonTest.pointX); // 输出 5
singleton的存在往往表明系统中的模块要么是系统紧密耦合,要么是其逻辑过于分散在代码库中多个部分。由于一系列的问题:从隐藏的依赖到创建多个实例的难度、底层依赖的难度等等,singleton测试会更麻烦
javascript设计模式-singleton(单例)模式
标签:
原文地址:http://blog.csdn.net/lfcss/article/details/52276198