全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

工厂模式在JS中的实践

一.   写在前面

 工厂模式和抽象工厂在后台代码中的使用,相信你一定非常熟悉,所以关于概念的东西也用不着我多说。你可以用其做为类与类之间,层与层之间的解耦。工厂模式没有什么难点,在JS中其实思想也是一样的,所以废话不多说,直接上实践的场景和代码。

二.  场景描述

 1.最近的项目的登陆使用了Owin认证,所以token必须找好地方进行存储,鉴于token需要在请求API资源的时候放到请求头的Authorization当中,以便在进入WebAPI前进行身份验证。所以我不想在主流浏览器中的cookie中存储token,因为这样一来,每次Cookie中带一份token,Authorization中又带一份token.多传输一次不说,还让人感到很low.这么 这么low的行为,你忍心使用吗。所以我希望把token存储于localStorage当中。那么问题来了,不支持H5的浏览器怎么办?

 2.为了将来把所有前端资源置于CDN, 前端仅拥有html,css和js。页面加载到浏览器客户端后,所有动态资源走AJAX,并且所有资源均跨域。那么问题又来了,跨域很容易解决,在IE8,IE9这种默认关闭跨域功能的浏览器怎么办?

三. 公共JS结构一览

我通常会给应用定义一个全局Application.js。其中大概包括如下内容。 先上整体代码结构,供参考

四. 引入工厂思想解决问题

为了解决上述两个问题,所以引入工厂模式,在工厂中创建对象,工厂中根据不同浏览器类型,创建不同对象。

也就是说在解决问题一上,在浏览器支持H5的时候,存储token于localStorage。在不支持h5的浏览器中还是存于cookie.

所以产生了两个JS对象,CookieStorageUtil对象,LocalStorageUtil对象。并且他们应该实现相同的“接口”,在这里我没有使用JS代码来模仿接口,而是采用注释的形式,标注两个对象需要实现相同的接口,实现接口中的两个方法write()和get()。并规范代码,下划线开头的为私有方法,这样一来今后修改内部代码的时候,私有方法随便改,对外部暴露的方法名称不变就好,是不是有点像后台的面向接口编程呢?其实JS也是一样的。再多费一句话,如果我不使用JS的function模拟类的话,是无法达到真正的方法私有,所以如果有人调用下划线'_'开头的私有方法,在今后私有方法有变动的时候影响了功能,那就不是我的锅咯?

还是上代码靠谱:

/**
  * Storage Factory -Author 吴双 cnblogs.com/tdws
  */
 StorageUtilManager: new Object({
  createStorageUtil: function () {
   if (window.applicationCache) {
    return AppUtil.LocalStorageUtil;
   } else {
    return AppUtil.CookieStorageUtil;
   }
  }
 }),
 /**
  * implement Storage -Author 吴双
  * write()
  * get()
  */
 CookieStorageUtil: {
  write: function (key, dataObj) {
   this._clearCookie(key);
   //写入的字符串
   var dataObjStr = JSON.stringify(dataObj);
   this._setCookie(key, dataObjStr, 15);
  },
  get: function (key) {
   return this._getCookie(key);
  },
  _setCookie: function (cname, cvalue, exdays) {
   var d = new Date();
   d.setTime(d.getTime() + (exdays * 24 * 60 * 60 * 1000));
   var expires = "expires=" + d.toUTCString();
   var path = "path=/";
   document.cookie = cname + "=" + cvalue + "; " + expires + "; " + path;
  },
  _getCookie: function (cname) {
   var name = cname + "=";
   var ca = document.cookie.split(';');
   for (var i = 0; i < ca.length; i++) {
    var c = ca[i];
    while (c.charAt(0) == ' ') c = c.substring(1);
    if (c.indexOf(name) != -1) return c.substring(name.length, c.length);
   }
   return null;
  },
  _clearCookie: function (key) {
   this._setCookie(key, "", -1);
  }
 },
 /**
  * implement Storage cnblogs.com/tdws
  * write()
  * get()
  */
 LocalStorageUtil: {
  write: function (key, dataObj) {
   this._writeLocalStorage(key, dataObj);
  },
  get: function (key) {
   return this._getFromLocalStorage(key);
  },
  _writeLocalStorage: function (key, dataObj) {
   var localStorage = window.localStorage;
   localStorage.removeItem(key);
   //对象转化为字符串,将objStr按正常的方式存入localStorage中
   var dataObjStr = JSON.stringify(dataObj);
   localStorage.setItem(key, dataObjStr);
  },
  _getFromLocalStorage: function (key) {
   var localStorage = window.localStorage;
   return localStorage.getItem(key);
  },
  _removeLocalStorage: function (key) {
   var localStorage = window.localStorage;
   localStorage.removeItem(key);
  }
 }

这样第二个问题也得到了解决,在不支持跨域的浏览器创建XDomainRequest对象来做请求,两个HttpUtil对象依然实现相同的接口中的方法。在这个跨域问题上,推荐使用gayhub中的一个1.8k的JS https://github.com/MoonScript/jQuery-ajaxTransport-XDomainRequest

对了,为了避免使用工厂模式,使代码调用复杂,我们可以简化JS

AppUtil.currentHttpUtil = AppUtil.HttpUtilManager.createHttpUtil();

五. 写在最后

所以有了这样的方式,问题平滑的解决了,两个StorageUtil与调用方,通过工厂StorageUtilManager完成解耦。可能你看完代码后说,不就是多了一个Manager吗?这也很简单啊,是啊,就是这么简单,这就是设计模式,它仅仅是前人的经验模式,它更平滑的解决我们的实际问题。

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持!


# js  # 工厂模式  # 详解js产生对象的3种基本方式(工厂模式  # 构造函数模式  # 原型模式)  # js面向对象之常见创建对象的几种方式(工厂模式、构造函数模式、原型模式)  # JS面向对象基础讲解(工厂模式、构造函数模式、原型模式、混合模式、动态原型模式)  # JavaScript 模式之工厂模式(Factory)应用介绍  # javascript 模式设计之工厂模式详细说明  # javascript 模式设计之工厂模式学习心得  # js简单工厂模式用法实例  # JavaScript设计模式之工厂模式和构造器模式  # javascript设计模式之工厂模式示例讲解  # Javascript面向对象设计一 工厂模式  # 不支持  # 下划线  # 解决问题  # 多说  # 器中  # 让人  # 来了  # 我不  # 在这个  # 那就  # 在这  # 这就是  # 是一样的  # 就好  # 可以用  # 推荐使用  # 是啊  # 很容易  # 没有什么  # 我们可以 


相关文章: 武清网站制作公司,天津武清个人营业执照注销查询系统网站?  C++中引用和指针有什么区别?(代码说明)  定制建站是什么?如何实现个性化需求?  小型网站制作HTML,*游戏网站怎么搭建?  网站制作专业公司有哪些,如何制作一个企业网站,建设网站的基本步骤有哪些?  建站之星如何快速更换网站模板?  常州企业网站制作公司,全国继续教育网怎么登录?  如何注册花生壳免费域名并搭建个人网站?  ,制作一个手机app网站要多少钱?  在线流程图制作网站手机版,谁能推荐几个好的CG原画资源网站么?  如何在香港服务器上快速搭建免备案网站?  寿县云建站:智能SEO优化与多行业模板快速上线指南  c++怎么用jemalloc c++替换默认内存分配器【性能】  深圳网站制作的公司有哪些,dido官方网站?  已有域名和空间,如何快速搭建网站?  平台云上自助建站如何快速打造专业网站?  建站中国必看指南:CMS建站系统+手机网站搭建核心技巧解析  如何在Windows虚拟主机上快速搭建网站?  在线教育网站制作平台,山西立德教育官网?  如何在建站之星网店版论坛获取技术支持?  如何用花生壳三步快速搭建专属网站?  如何解决VPS建站LNMP环境配置常见问题?  在线制作视频的网站有哪些,电脑如何制作视频短片?  ,在苏州找工作,上哪个网站比较好?  高配服务器限时抢购:企业级配置与回收服务一站式优惠方案  专业网站制作企业网站,如何制作一个企业网站,建设网站的基本步骤有哪些?  国美网站制作流程,国美电器蒸汽鍋怎么用官方网站?  魔毅自助建站系统:模板定制与SEO优化一键生成指南  MySQL查询结果复制到新表的方法(更新、插入)  合肥制作网站的公司有哪些,合肥聚美网络科技有限公司介绍?  长春网站建设制作公司,长春的网络公司怎么样主要是能做网站的?  Python lxml的etree和ElementTree有什么区别  如何在云服务器上快速搭建个人网站?  清单制作人网站有哪些,近日“兴风作浪的姑奶奶”引起很多人的关注这是什么事情?  如何通过虚拟主机快速完成网站搭建?  如何在Windows服务器上快速搭建网站?  建站VPS配置与SEO优化指南:关键词排名提升策略  南京网站制作费用,南京远驱官方网站?  建站与域名管理如何高效结合?  新网站制作渠道有哪些,跪求一个无线渠道比较强的小说网站,我要发表小说?  沈阳制作网站公司排名,沈阳装饰协会官方网站?  ,柠檬视频怎样兑换vip?  专业网站设计制作公司,如何制作一个企业网站,建设网站的基本步骤有哪些?  如何快速生成可下载的建站源码工具?  如何做网站制作流程,*游戏网站怎么搭建?  如何快速上传建站程序避免常见错误?  建站之星导航菜单设置与功能模块配置全攻略  赚钱网站制作软件,建一个网站怎样才能赚钱?是如何盈利的?  网站代码制作软件有哪些,如何生成自己网站的代码?  电商网站制作价格怎么算,网上拍卖流程以及规则? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。