JS设计模式——7.工厂模式(示例-RSS阅读器)
RSS阅读器
由于我们只想跟RSS容器对象打交道,所以用一个工厂来实例化这些内部对象并把它们组装到一个RSS阅读器中.
使用工厂方法在好处在于,我们创建的RSS阅读器类不会与那些成员对象紧密耦合在一起.
RSS阅读器的成员对象
成员对象1: xhr
这个对象就是上一篇中介绍过的,所以就不再说了.
成员对象2: 显示类
为了满足RSS阅读器类的需要,它需要实现几个方法.
- var DisplayModule = new Interface('DisplayModule', ['append', 'remove', 'clear']);
- var ListDisplay = function(id, parent){
- 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 = '';
- }
- };
成员对象3: 配置对象
这只是一个对象字面量,它包含着一些借位阅读器类及其成员对象使用的设置
- var conf = {
- id: 'con-top-stories',
- feedUrl: 'http://www.baidu.com',
- updateInteval: 60,
- parent: $('feed-readers')
- };
RSS阅读对象类
上面介绍的类都由一个名为FeedReader的类组合使用.它用xhr处理器从RSS源获取XML格式的数据并用一个内部方法进行解析,然后用显示模块将解析出来的信息输出到网页上.
- 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+'">'+this.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.updateInteval*1000);
- }
- };
使用工厂方法
现在还差一个部分,即把所有这些类和对象拼装起来的那个工厂方法.它被实现为一个简单工厂,如下所示.
- 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);
- }
- }
使用这个工厂方法,可以把FeedReader类所需的复杂设置封装起来,并且可以确保其成员对象都实现所需接口.
它还把对所使用在特定模块的硬性设定集中在一个位置(ListDisplay和createXhrHandler),哪天要是想使用ParagraphDisplay和QueueHandler,做起来也同样简单,只要改改这个工厂方法内部的代码就行.
等.
JS设计模式——7.工厂模式(示例-RSS阅读器)的更多相关文章
- JS设计模式——7.工厂模式(示例-XHR)
XHR工厂 基本实现 var AjaxHandler = new Interface('AjaxHandler', ['request', 'createXHR']); var SimpleHandl ...
- [JS设计模式]:工厂模式(3)
简单工厂模式是由一个方法来决定到底要创建哪个类的实例, 而这些实例经常都拥有相同的接口. 这种模式主要用在所实例化的类型在编译期并不能确定, 而是在执行期决定的情况. 说的通俗点,就像公司茶水间的饮料 ...
- js设计模式:工厂模式、构造函数模式、原型模式、混合模式
一.js面向对象程序 var o1 = new Object(); o1.name = "宾宾"; o1.sex = "男"; o1.a ...
- JS设计模式之工厂模式
1 什么是工厂模式? 工厂模式是用来创建对象的一种最常用的设计模式.我们不暴露创建对象的具体逻辑,而是将将逻辑封装在一个函数中,那么这个函数就可以被视为一个工厂.工厂模式根据抽象程度的不同可以分为: ...
- JS设计模式--简单工厂模式
在JS中创建对象会习惯的使用new关键字和类构造函数(也是可以用对象字面量). 工厂模式就是一种有助于消除两个类依赖性的模式. 工厂模式分为简单工厂模式和复杂工厂模式,这篇主要讲简单工厂模式. 简单工 ...
- JS设计模式——7.工厂模式(概念)
工厂模式 本章讨论两种工厂模式: 简单工厂模式 使用一个类(通常是一个单体)来生成实例. 使用场景:假设你想开几个自行车商店(创建自行车实例,组装它,清洗它,出售它),每个店都有几种型号的自行车出售. ...
- JavaScript设计模式(3)-工厂模式
工厂模式 1. 简单工厂 简单工厂:使用一个类或对象封装实例化操作 假如我们有个自行车商店类 BicycleShop,它提供了销售自行车的方法可以选择销售两类自行车 Speedster,Comfort ...
- C#学习之设计模式:工厂模式
最近研究一下设计模式中工厂模式的应用,在此记录如下: 什么是工厂模式? 工厂模式属于设计模式中的创造型设计模式的一种.它的主要作用是协助我们创建对象,为创建对象提供最佳的方式.减少代码中的耦合程度,方 ...
- 设计模式——抽象工厂模式及java实现
设计模式--抽象工厂模式及java实现 设计模式在大型软件工程中很重要,软件工程中采用了优秀的设计模式有利于代码维护,方便日后更改和添加功能. 设计模式有很多,而且也随着时间在不断增多,其中最著名的是 ...
随机推荐
- javascript 进阶篇1 正则表达式,cookie管理,userData
首先,什么事正则表达式呢,其实引入概念很多时候并不能帮我们明白它到底是什么,所以我先简单描述下,正则表达式,其实就是一个记录字符串规则则的字符串,等我们看完这一部分,也就能明白它到底是什么了. 基本语 ...
- Java的StringBuIlder扩容机制
JDK 1.6中,扩容的源码是这样: void expandCapacity(int minimumCapacity) { int newCapacity = (value.length + 1) * ...
- Zookeeper的基础
认识Zookeeper zookeeper是什么 分布式数据的一致性解决方案. Zookeeper 能做什么 数据发布和订阅(配置中心,config,disconf,diamond,appollo) ...
- C++模式学习------工厂模式
工厂模式属于创建型模式,大致可以分为简单工厂模式.抽象工厂模式. 简单工厂模式,它的主要特点是需要在工厂类中做判断,从而创造相应的产品. enum PTYPE { ProdA = , ProdB = ...
- SDOI2017硬币游戏
题面链接 洛咕 sol 神题,幸好我不是SD的QAQ. 假设你们都会\(O(n^3m^3)\)的高斯消元,具体来说就是建出\(Trie\)图然后套游走的板子. 然后我们发现可以把不能匹配任何串的概率压 ...
- 【BZOJ2655】Calc(拉格朗日插值,动态规划)
[BZOJ2655]Calc(多项式插值,动态规划) 题面 BZOJ 题解 考虑如何\(dp\) 设\(f[i][j]\)表示选择了\(i\)个数并且值域在\([1,j]\)的答案. \(f[i][j ...
- rsync命令比对文件及增量同步
A fast,versatile,remote (and local) file-copying tool. rsync基于ssh协议实现高效率远程或本地文件复制,传输速度比scp快.复制文件时会比对 ...
- 【费用流】【网络流24题】【P4013】 数字梯形问题
Description 给定一个由 \(n\) 行数字组成的数字梯形如下图所示. 梯形的第一行有 \(m\) 个数字.从梯形的顶部的 \(m\) 个数字开始,在每个数字处可以沿左下或右下方向移动,形成 ...
- ZABBIX 3.0 监控MongoDB性能【OK】
系统环境: centos7.2 zabbix-3.4 一.原理 通过以下命令查看mongodb的状态: echo "db.serverStatus()" | mongo ad ...
- Ansible4:Ad-hoc与命令执行模块
目录 Ad-hoc 命令说明 后台执行 命令执行模块 command模块 script模块 Ad-Hoc 是指ansible下临时执行的一条命令,并且不需要保存的命令,对于复杂的命令会使用playbo ...