JavaScript 设计模式学习 Factory


Posted in Javascript onJuly 29, 2009
/* DisplayModule interface. */ 
var DisplayModule = new Interface('DisplayModule', ['append', 'remove', 'clear']); 
/* ListDisplay class. */ 
//通过接口实现工厂,这是通过List方式显示RSS 
var ListDisplay = function(id, parent) { // implements DisplayModule 
this.list = document.createElement('ul'); 
this.list.id = id; 
parent.appendChild(this.list); 
}; 
ListDisplay.prototype = { 
append: function(text) { 
var newEl = document.createElement('li'); 
this.list.appendChild(newEl); 
newEl.innerHTML = text; 
return newEl; 
}, 
remove: function(el) { 
this.list.removeChild(el); 
}, 
clear: function() { 
this.list.innerHTML = ''; 
} 
}; 
/* Configuration object. */ 
var conf = { 
id: 'cnn-top-stories', 
feedUrl: 'http://rss.cnn.com/rss/cnn_topstories.rss', 
updateInterval: 60, // In seconds. 
parent: $('feed-readers') 
}; 
/* FeedReader class. */ 
var FeedReader = function(display, xhrHandler, conf) { 
this.display = display; 
this.xhrHandler = xhrHandler; 
this.conf = conf; 
this.startUpdates(); 
}; 
FeedReader.prototype = { 
fetchFeed: function() { 
var that = this; 
var callback = { 
success: function(text, xml) { that.parseFeed(text, xml); }, 
failure: function(status) { that.showError(status); } 
}; 
this.xhrHandler.request('GET', 'feedProxy.php?feed=' + this.conf.feedUrl, 
callback); 
}, 
parseFeed: function(responseText, responseXML) { 
this.display.clear(); 
var items = responseXML.getElementsByTagName('item'); 
for(var i = 0, len = items.length; i < len; i++) { 
var title = items[i].getElementsByTagName('title')[0]; 
var link = items[i].getElementsByTagName('link')[0]; 
this.display.append('<a href="' + link.firstChild.data + '">' + 
title.firstChild.data + '</a>'); 
} 
}, 
showError: function(statusCode) { 
this.display.clear(); 
this.display.append('Error fetching feed.'); 
}, 
stopUpdates: function() { 
clearInterval(this.interval); 
}, 
startUpdates: function() { 
this.fetchFeed(); 
var that = this; 
this.interval = setInterval(function() { that.fetchFeed(); }, 
this.conf.updateInterval * 1000); 
} 
}; 
/* FeedManager namespace. */ 
//工厂管理器,这里可以根据传进来的参数选择具体的Display 
var FeedManager = { 
createFeedReader: function(conf) { 
var displayModule = new ListDisplay(conf.id + '-display', conf.parent); 
Interface.ensureImplements(displayModule, DisplayModule); 
var xhrHandler = XhrManager.createXhrHandler(); 
Interface.ensureImplements(xhrHandler, AjaxHandler); 
return new FeedReader(displayModule, xhrHandler, conf); 
} 
}; 
===================================================== 
另一个自行车工厂的例子: 
var BicycleShop = function() {}; 
BicycleShop.prototype = { 
sellBicycle: function(model) { 
var bicycle = this.createBicycle(model); 
bicycle.assemble(); 
bicycle.wash(); 
return bicycle; 
}, 
createBicycle: function(model) { 
throw new Error('Unsupported operation on an abstract class.'); 
} 
}; 
/* AcmeBicycleShop class. */ 
var AcmeBicycleShop = function() {}; 
extend(AcmeBicycleShop, BicycleShop); 
AcmeBicycleShop.prototype.createBicycle = function(model) { 
var bicycle; 
switch(model) { 
case 'The Speedster': 
bicycle = new AcmeSpeedster(); 
break; 
case 'The Lowrider': 
bicycle = new AcmeLowrider(); 
break; 
case 'The Flatlander': 
bicycle = new AcmeFlatlander(); 
break; 
case 'The Comfort Cruiser': 
default: 
bicycle = new AcmeComfortCruiser(); 
} 
Interface.ensureImplements(bicycle, Bicycle); 
return bicycle; 
}; 
/* GeneralProductsBicycleShop class. */ 
var GeneralProductsBicycleShop = function() {}; 
extend(GeneralProductsBicycleShop, BicycleShop); 
GeneralProductsBicycleShop.prototype.createBicycle = function(model) { 
var bicycle; 
switch(model) { 
case 'The Speedster': 
bicycle = new GeneralProductsSpeedster(); 
break; 
case 'The Lowrider': 
bicycle = new GeneralProductsLowrider(); 
break; 
case 'The Flatlander': 
bicycle = new GeneralProductsFlatlander(); 
break; 
case 'The Comfort Cruiser': 
default: 
bicycle = new GeneralProductsComfortCruiser(); 
} 
Interface.ensureImplements(bicycle, Bicycle); 
return bicycle; 
};

/* Usage. */
var alecsCruisers = new AcmeBicycleShop(); 
var yourNewBike = alecsCruisers.sellBicycle('The Lowrider'); 
var bobsCruisers = new GeneralProductsBicycleShop(); 
var yourSecondNewBike = bobsCruisers.sellBicycle('The Lowrider');

Javascript 相关文章推荐
jquery实现图片翻页效果
Dec 23 Javascript
JavaScript中的函数重载深入理解
Aug 04 Javascript
认识Knockout及如何使用Knockout绑定上下文
Dec 25 Javascript
jQuery实现微信长按识别二维码功能
Aug 26 Javascript
JS实现课堂随机点名和顺序点名
Mar 09 Javascript
ES6学习教程之块级作用域详解
Oct 09 Javascript
React Native中导航组件react-navigation跨tab路由处理详解
Oct 31 Javascript
浅谈vue中慎用style的scoped属性
Nov 28 Javascript
Vue实现美团app的影院推荐选座功能【推荐】
Aug 29 Javascript
解决LayUI数据表格复选框不居中显示的问题
Sep 25 Javascript
使用element-ui +Vue 解决 table 里包含表单验证的问题
Jul 17 Javascript
Javascript表单序列化原理及实现代码详解
Oct 30 Javascript
JQuery UI皮肤定制
Jul 27 #Javascript
JavaScript 设计模式学习 Singleton
Jul 27 #Javascript
xml 封装与解析(javascript和C#中)
Jul 26 #Javascript
JavaScript 捕获窗口关闭事件
Jul 26 #Javascript
jquery tools之tooltip
Jul 25 #Javascript
jquery tools之tabs 选项卡/页签
Jul 25 #Javascript
jquery JSON的解析方式
Jul 25 #Javascript
You might like
测试php函数的方法
2013/11/13 PHP
PHP实时统计中文字数和区别
2019/02/28 PHP
Laravel项目中timeAgo字段语言转换的改善方法示例
2019/09/16 PHP
JavaScript 中的事件教程
2007/04/05 Javascript
LBS blog sql注射漏洞[All version]-官方已有补丁
2007/08/26 Javascript
jquery向.ashx文件post中文乱码问题的解决方法
2011/03/28 Javascript
form.submit()不能提交表单的错误原因及解决方法
2014/10/13 Javascript
JavaScript中的Web worker多线程API研究
2014/12/06 Javascript
javascript实现可全选、反选及删除表格的方法
2015/05/15 Javascript
JavaScript中获取Radio被选中的值
2015/11/11 Javascript
jQuery操作动态生成的内容的方法
2016/05/28 Javascript
Bootstrap表单Form全面解析
2016/06/13 Javascript
解决URL地址中的中文乱码问题的办法
2017/02/10 Javascript
uploader秒传图片到服务器完整代码
2017/04/22 Javascript
vue2.0$nextTick监听数据渲染完成之后的回调函数方法
2018/09/11 Javascript
vue 对象添加或删除成员时无法实时更新的解决方法
2019/05/01 Javascript
解决ant design vue中树形控件defaultExpandAll设置无效的问题
2020/10/26 Javascript
Python 专题六 局部变量、全局变量global、导入模块变量
2017/03/20 Python
python+selenium+autoit实现文件上传功能
2017/08/23 Python
Python语言的变量认识及操作方法
2018/02/11 Python
Python验证码截取识别代码实例
2020/05/16 Python
python中什么是面向对象
2020/06/11 Python
Django多数据库联用实现方法解析
2020/11/12 Python
python实现企业微信定时发送文本消息的实例代码
2020/11/25 Python
python 统计list中各个元素出现的次数的几种方法
2021/02/20 Python
斯洛伐克最大的婴儿食品和用品网上商店:Feedo.sk
2020/12/21 全球购物
美国在线肉类和海鲜配送:Crowd Cow
2020/10/02 全球购物
优秀少先队工作者事迹材料
2014/05/13 职场文书
习总书记三严三实学习心得体会
2014/10/13 职场文书
英语演讲开场白
2015/05/29 职场文书
家庭经济困难证明
2015/06/23 职场文书
观看《筑梦中国》纪录片心得体会
2016/01/18 职场文书
历史名人教你十五个读书方法,赶快Get起来!
2019/07/18 职场文书
个人工作总结(管理人员)范文
2019/08/13 职场文书
Python趣味实战之手把手教你实现举牌小人生成器
2021/06/07 Python
Win11怎么进入安全模式?Windows 11进入安全模式的方法
2021/11/21 数码科技