模块模式和单例模式的详解

模块模式

模块模式使用闭包封装私有状态和组织。它提供了一种包装公有/私有方法和变量的方式,防止其泄露至全局作用域。通过该模式,只需返回一个共有api,而其他的一切都维持在私有闭包里。该模式返回一个对象。

在模块模式中,由于闭包的存在,声明的变量和方法只在该模式内部可用,但在返回对象上定义的变量和方法,则对外部使用者都是可用的。

举个例子:

var testModule = (function(){
	var counter = 0;
	return {
		incrementCounter: function(){
			return ++counter;
		},
		resetCounter: function(){
			counter = 0;
		}
	};
})();

上面的incrementCounter和resetCounter方法,只能通过testModule进行调用,并且里面的counter变量只能通过这两个方法进行访问。

模块模式应用最广泛的情况:基于jquery或zepto开发插件。

举个例子:

var testModule = (function(jQ){
	function privateMethod(){
		jQ(".container").html("test");
	}
	return {
		publicMethod: function(){
			privateMethod();
		}
	};
})(jQuery);

我们可以在自己定义的模块testModule中使用jQuery,并且在模块内部,我们使用了别名jQ来表示jQuery。

单例模式

单例模式被熟知的原因是因为它限制了类的实例化次数只能一次。在该类的实例不存在的情况下,可以通过一个方法创建该类的实例,如果实例已经存在,它会简单返回该实例对象的引用。

举个例子:

var mySingleton = (function(){
	var instance;
	function init(){
		function privateMethod(){
			console.log("method call");
		}
		var privateVar = "I am private";
		return {
			publicMethod:function(){
				privateMthod();
			},
			publicVar:"I am public",
			getPrivateVar: function(){
				return privateVar;
			}
		};
	}
	return {
		getInstance: function(){
			if(!instance){
				instance = init();
			}
			return instance;
		}
	}
})();

当调用mySingleton.getInstance方法时,由于实例对象instance不存在,因此会调用init方法创建一个实例对象,这时instance引用此实例对象。当第二次调用mySingleton.getInstance方法时,由于instance存在,因此直接返回instance。

在实践中,你的系统需要一个对象来协调其他对象时,单例模式是很有用的。

 

 

 

加油!

转载于:https://www.cnblogs.com/chaojidan/p/4476353.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值