javascript设计模式——单例模式(Singleton)

某个类只允许创建一个实例,这就是单例模式。
Singleton模式指的是一个“类”只能创造一个实例。 单体模式思想在于保证一个特定类仅有一个实例,意味着当你第二次使用同一个类创建对象时,应得到和第一次创建对象完全相同。

示例一
var Singleton = (function(){
	function Map(width,height){
		this.width = width;
		this.height = height;
	}
	var instance;
	return {
		getInstance:function(width,height){
			if(instance==undefined){
				instance = new Map(width,height);
			}else{
				instance.width = width;
				instance.height = height;
			}
		return instance;
		}
	}
})();
var t1 = Singleton.getInstance(100,200);
var t2 = Singleton.getInstance(250,350);
示例二
function Map(width,height){
	if(typeof Map.instance =='object'){
		Map.instance.width = width;
		Map.instance.height = height;
		return Map.instance;
	}
	this.width = width;
	this.height = height;
	Map.instance = this; //把new出来的this对象赋值给Map的instance
}
var t1 = new Map(100,200);
var t2 = new Map(250,350);

单例模式在我们平时的应用中用的比较多的,相当于把我们的代码封装在一个起来,只是暴露一个入口,从而避免全部变量的污染。有一些对象我们往往只需要一个,比如全局缓存、浏览器的window对象。试想一下,当我们单击登录按钮的时候,页面中会出现一个登录框,而这个浮窗是唯一的,无论单击多少次登录按钮,这个浮窗只会被创建一次。因此这个登录浮窗就适合用单例模式。

优点:

- 某些类创建比较频繁,对于一些大型的对象,这是一笔很大的系统开销。
- 省去了new操作符,降低了系统内存的使用频率,减轻GC( 垃圾回收 )压力。
- 有些类如交易所的核心交易引擎,控制着交易流程,如果该类可以创建多个的话,系统完全乱了。(比如:中国国家主席只有一个),所以只有使用单例模式,才能保证核心交易服务器独立控制整个流程。

缺点:

由于单体模式提供的是一种单体访问,所以它有可能导致模块间的强耦合。有时创建一个可实例化的类更为可取,哪怕它只会被实例化一次。因为这种模式可能会导致类间的强耦合,所以它不利于单元测试。你无法单独测试一个调用了来自单体的方法的类,而只能把它与那个单体作为一个单元一起测试。单体最好还是留给定义命名空间和实现分支型方法这些用途。在这些情况下,耦合不是什么问题。

猜你喜欢

转载自blog.csdn.net/weixin_43153361/article/details/84889954