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 相关文章推荐
关于javascript 回调函数中变量作用域的讨论
Sep 11 Javascript
js 关键词高亮(根据ID/tag高亮关键字)案例介绍
Jan 21 Javascript
javascript游戏开发之《三国志曹操传》零部件开发(一)让静态人物动起来
Jan 23 Javascript
js自定义事件及事件交互原理概述(二)
Feb 01 Javascript
js判断客户端是iOS还是Android等移动终端的方法
Dec 11 Javascript
jquery的ajax异步请求接收返回json数据实例
Jun 16 Javascript
js中的getAttribute方法使用示例
Aug 01 Javascript
JQuery EasyUI Layout 在from布局自适应窗口大小的实现方法
May 28 Javascript
AngularJS报错$apply already in progress的解决方法分析
Jan 30 Javascript
hammer.js实现图片手势放大效果
Aug 29 Javascript
如何解决React官方脚手架不支持Less的问题(小结)
Sep 12 Javascript
使用gulp构建前端自动化的方法示例
Dec 25 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
基于PHP静态类的原罪详解
2013/05/06 PHP
ThinkPHP模板判断输出Empty标签用法详解
2014/06/30 PHP
PHP 7安装调试工具Xdebug扩展的方法教程
2017/06/17 PHP
Json对象替换字符串占位符实现代码
2010/11/17 Javascript
functional继承模式 摘自javascript:the good parts
2011/06/20 Javascript
跨浏览器通用、可重用的选项卡tab切换js代码
2011/09/20 Javascript
详解强大的jQuery选择器之基本选择器、层次选择器
2012/02/07 Javascript
javaScript 动态访问JSon元素示例代码
2013/08/30 Javascript
JavaScript排序算法之希尔排序的2个实例
2014/04/04 Javascript
元素未显示设置width/height时IE中使用currentStyle获取为auto
2014/05/04 Javascript
js实现弹出窗口、页面变成灰色并不可操作的例子分享
2014/05/10 Javascript
jQuery+CSS3实现树叶飘落特效
2015/02/01 Javascript
js+html5实现的自由落体运动效果代码
2016/01/28 Javascript
JS中frameset框架弹出层实例代码
2016/04/01 Javascript
jQuery文字提示与图片提示效果实现方法
2016/07/04 Javascript
jQuery DateTimePicker 日期和时间插件示例
2017/01/22 Javascript
seajs和requirejs模块化简单案例分析
2019/08/26 Javascript
Vue实现input宽度随文字长度自适应操作
2020/07/29 Javascript
Python脚本实现DNSPod DNS动态解析域名
2015/02/14 Python
对numpy中布尔型数组的处理方法详解
2018/04/17 Python
Django处理文件上传File Uploads的实例
2018/05/28 Python
对numpy数据写入文件的方法讲解
2018/07/09 Python
Django model序列化为json的方法示例
2018/10/16 Python
python实现代码统计程序
2019/09/19 Python
python简单的三元一次方程求解实例
2020/04/02 Python
Python爬虫抓取论坛关键字过程解析
2020/10/19 Python
新加坡领先的在线生活方式和杂货购物网站:EAMART
2019/04/02 全球购物
List、Map、Set三个接口,存取元素时,各有什么特点?
2015/09/27 面试题
关键字throw与throws的用法差异
2016/11/22 面试题
计算机通信专业推荐信
2014/02/22 职场文书
酒店总经理岗位职责
2014/03/17 职场文书
2014迎国庆标语大全
2014/09/19 职场文书
预备党员自我评价范文
2015/03/04 职场文书
2015年药品销售工作总结范文
2015/05/25 职场文书
pytorch 6 batch_train 批训练操作
2021/05/28 Python
mysql5.7使用binlog 恢复数据的方法
2021/06/03 MySQL