- 单例模式
用于创建唯一的一个对象。
核心在于一个判断
var index
if(index){
return index;
}
init();
这样只会在第一次的时候初始化创建对象,以后都不会再创建对象。
还有闭包内的变量不会销毁,例如index可以始终存在。
js的实现:
1 var getSingle = function (fn) { 2 var result; 3 return function () { 4 return result || (result = fn.apply(this, arguments)); 5 }; 6 }; 7 //创建登陆div 8 var createSingletonLoginLayer = getSingle(function () { 9 var div = document.createElement('div'); 10 div.innerHTML = '我是悬浮窗'; 11 div.style.display = 'none'; 12 document.body.appendChild(div); 13 return div; 14 }); 15 16 document.getElementById('loginBtn').onclick = function () { 17 var loginLayer = createSingletonLoginLayer(); 18 loginLayer.style.display = 'block'; 19 }; 20 //创建iframe 21 var createSingleIframe = getSingle(function () { 22 var iframe = document.createElement('iframe'); 23 document.body.appendChild(iframe); 24 return iframe; 25 }); 26 27 document.getElementById('loginBtn2').onclick = function () { 28 var loginLayer = createSingleIframe(); 29 loginLayer.src = 'http://baidu.com'; 30 };
- 策略模式
个人感觉这个模式挺啰嗦的,挺短的几行代码用完这个模式就变得貌似又臭又长,所以可用在验证、以及可以复用的组件等地方。 不能复用真的感觉写这么长一串不值。
个人感觉这个模式核心在于把条件放在对象中代替用if来代替
策略模式的目的是将算法的使用与算法的实现分离开来。
- 代理模式
类似明星有经纪人。
代理可以帮助接收者过滤掉一些条件。
引入代理、多创建一个对象,为了符合对象的单一职责原则。以后需求变更可以不更改原对象情况下将代理去掉。
代理和本体需要显式地实现同一个接口(同样的函数名)
分页可以使用 缓存代理 同一页的数据只从后台请求一次,不用每次都从后台请求。
var cache = {};
return function(){
var args = Array.prototype.join.call(arguments,',');
if(args in cache){
return cache[args];
}
return cache[args] = mult.apply(this,arguments);
};
我们在编写业务代码的时候,往往不需要去预先猜测是否需要使用代理模式。 当真正发现不方便直接访问某个对象的时候, 再编写代理也不迟。