javascript设计模式 ? 抽象工厂模式原理与应用实例分析


Posted in Javascript onApril 09, 2020

本文实例讲述了javascript设计模式 ? 抽象工厂模式原理与应用。分享给大家供大家参考,具体如下:

介绍:基于工厂模式,继续升级。来解决工厂模式存在多个工厂类的问题。主要的思想是将一些相关的产品组成一个产品族,由同一个工厂来统一生产。

定义:抽象工厂模式提供一个创建一系列相关或相互依赖的接口,而无须指定他们具体的类。抽象工厂模式又称kit模式,它是一种对象创建型模式。

场景:还是上面的Dialog类,如果继续向后发展,会有各种各样的弹窗,如果新增一个弹窗包含了notice和toast。这样的情况下,我们不需要再单独新增一个工厂类。我们需要对这一类具有同样特征的弹窗进行聚合。

示例:

var Dialog = function(){
  this.show = function(){
    console.log(this.name + ' is show -> ' + this.element);
  }
};
 
Dialog.createNotice = function(){
  var _dialog = new Dialog();
  _dialog.element = '<div>notice</div>';
  _dialog.name = 'notice';
  return _dialog;
};
 
Dialog.createToast = function(){
  var _dialog = new Dialog();
  _dialog.element = '<div>toast</div>';
  _dialog.name = 'toast';
  return _dialog;
};
 
Dialog.createWarnin = function(){
  var _dialog = new Dialog();
  _dialog.element = '<div>warnin</div>';
  _dialog.name = 'warnin';
  return _dialog;
};
 
 
var Factory = {};
 
Factory.ConvergeFactory = function(){
  return {
    getNotice: function(){
      return Dialog.createNotice();
    },
    getToast: function(){
      return Dialog.createToast();
    },
 getWarnin: function(){
     return Dialog.createWarnin();
 }
  }
}
 
var converge = Factory.ConvergeFactory();
var notice = converge.getNotice();
var toast = converge.getToast();
var warnin = converge.getWarnin();
notice.show(); //notice is show -> <div>notice</div>
toast.show(); //toast is show -> <div>toast</div>
warnin.show(); //warnin is show -> <div> warnin </div>

抽象工厂模式主要解决的是Factory过多的问题,经过组合产生新的产品族。

我们这里的举例有些牵强,换个场景,如果我们有很多按钮啊,输入框之类的组件,要通过单独的工厂进行获取实例。

抽象工厂模式就是将特定的组件经过聚合产生新的工厂。

但这样的结果好还是不好,增加新的产品族时遵守了开关原则,但是在对新的产品族结构进行修改时就会发现需要从业务到工厂到子类挨个修改,也违反了开关原则。

所以抽象工厂模式的使用场景需要特别严谨,要在设计之初全面考虑,不要轻易对产品族结构进行修改。

抽象工厂模式总结:

优点:
* 当产品族被使用后,隔离了具体类的实现
* 新增产品族时很方便,无需修改已有结构,符合开关原则

缺点:
* 修改已有产品族结构时,需要修改工厂以及所有使用的业务代码。

前面我们介绍了三种工厂模式,在前端使用的过程中,要灵活的应用,使用其思想而不是生搬硬套。

工厂模式核心是通过不同参数来生成不同产品。抽象工厂和工厂是在实际场景下进行优化而来。

这也提醒我们,要不断地对代码进行思考,进行优化。

感兴趣的朋友可以使用在线HTML/CSS/JavaScript代码运行工具:http://tools.3water.com/code/HtmlJsRun测试上述代码运行效果。

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
jqeury eval将字符串转换json的方法
Jan 20 Javascript
Three.js源码阅读笔记(物体是如何组织的)
Dec 27 Javascript
js使用eval解析json实例与注意事项分享
Jan 18 Javascript
jQuery+ajax中getJSON() 用法实例
Dec 22 Javascript
javascript从定义到执行 你不知道的那些事
Jan 04 Javascript
轻松实现jquery手风琴效果
Jan 14 Javascript
JavaScript中const、var和let区别浅析
Oct 11 Javascript
完全深入学习Bootstrap表单
Nov 28 Javascript
self.attachevent is not a function的解决方法
Apr 04 Javascript
详解Vue-cli 创建的项目如何跨域请求
May 18 Javascript
js 获取元素的具体样式信息getcss(实例讲解)
Jul 05 Javascript
js构建二叉树进行数值数组的去重与优化详解
Mar 26 Javascript
javascript设计模式 ? 工厂模式原理与应用实例分析
Apr 09 #Javascript
javascript设计模式 ? 简单工厂模式原理与应用实例分析
Apr 09 #Javascript
javascript设计模式 ? 单例模式原理与应用实例分析
Apr 09 #Javascript
微信小程序纯文本实现@功能
Apr 08 #Javascript
JavaScript 俄罗斯方块游戏实现方法与代码解释
Apr 08 #Javascript
vue与iframe之间的信息交互的实现
Apr 08 #Javascript
Javascript摸拟自由落体与上抛运动原理与实现方法详解
Apr 08 #Javascript
You might like
克隆一个新项目的快捷方式
2013/04/10 PHP
php实现文件下载(支持中文文名)
2013/12/04 PHP
PHP缓存机制Output Control详解
2014/07/14 PHP
PHP开发之用微信远程遥控服务器
2018/01/25 PHP
php微信公众号开发之现金红包
2018/04/16 PHP
php遍历目录下文件并按修改时间排序操作示例
2019/07/12 PHP
Yii框架where查询用法实例分析
2019/10/22 PHP
PHPExcel实现的读取多工作表操作示例
2020/04/14 PHP
JQuery 获取json数据$.getJSON方法的实例代码
2013/08/02 Javascript
5分钟理解JavaScript中this用法分享
2013/11/09 Javascript
JavaScript实现列表分页功能特效
2015/05/15 Javascript
JS实现淘宝支付宝网站的控制台菜单效果
2015/09/28 Javascript
jQuery Ajax使用FormData对象上传文件的方法
2016/09/07 Javascript
详解javascript中对数据格式化的思考
2017/01/23 Javascript
Bootstrap Table从零开始
2017/06/30 Javascript
微信小程序使用request网络请求操作实例
2017/12/15 Javascript
小程序指纹验证的实现代码
2018/12/04 Javascript
elementUI多选框反选的实现代码
2019/04/03 Javascript
前端js中的事件循环eventloop机制详解
2019/05/15 Javascript
浅析JavaScript 函数柯里化
2020/09/08 Javascript
实用的 vue tags 创建缓存导航的过程实现
2020/12/03 Vue.js
Python使用Socket(Https)Post登录百度的实现代码
2012/05/18 Python
在Python的struct模块中进行数据格式转换的方法
2015/06/17 Python
python实现获取Ip归属地等信息
2016/08/27 Python
利用Python批量提取Win10锁屏壁纸实战教程
2018/03/27 Python
详解Python网络框架Django和Scrapy安装指南
2019/04/01 Python
Python hashlib常见摘要算法详解
2020/01/13 Python
python批量替换文件名中的共同字符实例
2020/03/05 Python
使用python实现学生信息管理系统
2021/02/25 Python
施华洛世奇波兰官网:SWAROVSKI波兰
2019/06/18 全球购物
EJB包括(SessionBean,EntityBean)说出他们的生命周期,及如何管理事务的?
2013/02/17 面试题
网吧最新创业计划书范文
2014/03/27 职场文书
法人授权委托书
2014/09/16 职场文书
2014年政协委员工作总结
2014/12/01 职场文书
优秀大学生事迹材料
2014/12/24 职场文书
高校教师个人总结
2015/02/10 职场文书