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 相关文章推荐
制作jquery遮罩层效果导航菜单代码分享
Dec 25 Javascript
cookie的secure属性详解
Apr 08 Javascript
jQuery实现仿Alipay支付宝首页全屏焦点图切换特效
May 04 Javascript
jQuery动态效果显示人物结构关系图的方法
May 07 Javascript
JavaScript焦点事件、鼠标事件和滚轮事件使用详解
Jan 15 Javascript
网站发布后Bootstrap框架引用woff字体无法正常显示的解决方法
Nov 24 Javascript
vue 2.0封装model组件的方法
Aug 03 Javascript
AngularJS中filter的使用实例详解
Aug 25 Javascript
JS排序算法之希尔排序与快速排序实现方法
Dec 12 Javascript
详解在Node.js中发起HTTP请求的5种方法
Jan 10 Javascript
js脚本中执行java后台代码方法解析
Oct 11 Javascript
vant 中van-list的用法说明
Nov 11 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多线程类及用法实例
2014/12/03 PHP
PHP获取文件夹内文件数的方法
2015/03/12 PHP
PHP脚本监控Nginx 502错误并自动重启php-fpm
2015/05/13 PHP
Zend Framework教程之Zend_Config_Xml用法分析
2016/03/23 PHP
php通过pecl方式安装扩展的实例讲解
2018/02/02 PHP
详解PHP发送邮件知识点
2018/05/06 PHP
一个刚完成的layout(拖动流畅,不受iframe影响)
2007/08/17 Javascript
一段利用WSH修改和查看IP配置的代码
2008/05/11 Javascript
js 数组操作代码集锦
2009/04/28 Javascript
jquery 实现checkbox全选,反选,全不选等功能代码(奇数)
2012/10/24 Javascript
JQuery页面的表格数据的增加与分页的实现
2013/12/10 Javascript
js 3秒后跳转页面的实现代码
2014/03/10 Javascript
ExtJS4 表格的嵌套 rowExpander应用
2014/05/02 Javascript
JQuery EasyUI 数字格式化处理示例
2014/05/05 Javascript
jQuery实现给页面换肤的方法
2015/05/30 Javascript
js实现根据身份证号自动生成出生日期
2015/12/15 Javascript
两行代码轻松搞定JavaScript日期验证
2016/08/03 Javascript
Angularjs中的ui-bootstrap的使用教程
2017/02/19 Javascript
Avalonjs双向数据绑定与监听的实例代码
2017/06/23 Javascript
js禁止浏览器页面后退功能的实例(推荐)
2017/09/01 Javascript
面包屑导航详解
2017/12/07 Javascript
Layui动态生成select下拉选择框不显示的解决方法
2019/09/24 Javascript
浅谈vue 锚点指令v-anchor的使用
2019/11/13 Javascript
js判断在哪个浏览器打开项目的方法
2020/01/21 Javascript
vue v-for 点击当前行,获取当前行数据及event当前事件对象的操作
2020/09/10 Javascript
python内置函数sorted()用法深入分析
2019/10/08 Python
python通过nmap扫描在线设备并尝试AAA登录(实例代码)
2019/12/30 Python
Python3+PyCharm+Django+Django REST framework配置与简单开发教程
2021/02/16 Python
HTML5 新旧语法标记对我们有什么好处
2012/12/13 HTML / CSS
美国美妆网站:B-Glowing
2016/10/12 全球购物
电焊工工作岗位职责
2014/02/06 职场文书
企业管理毕业生求职信
2014/03/11 职场文书
医疗专业毕业生求职信
2014/08/28 职场文书
2014年计划生育工作总结
2014/11/14 职场文书
关于倡议书的范文
2015/04/29 职场文书
《自己的花是让别人看的》教学反思
2016/02/19 职场文书