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


Posted in Javascript onApril 09, 2020

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

介绍:前面我们介绍了简单工厂模式,简单工厂模式存在一个严重的问题:当需要扩展时必定要修改工厂类的源代码。我们虽然在第二个demo中做了一些优化,但是我们需在使用时明确指定执行方法的名字,这无疑提高了使用成本。那如何实现增加新产品而不影响已有代码?工厂模式应运而生。

定义:定义一个用于创建对象的接口,让子类决定将哪一个类实例化。工厂模式让一个类的实例化延迟到其子类。工厂模式又称为工厂方法模式,又可称为虚拟构造器模式或多态工厂模式。工厂模式是一种类创建型模式。

场景:还是基于简单工厂模式的场景,我们试着用工厂模式解决弹窗类的问题。

示例:

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.NoticeFactory = function(){
  return Dialog.createNotice();
}
 
Factory.ToastFactory = function(){
  return Dialog.createToast();
}
 
Factory.WarninFactory = function(){
  return Dialog.createWarnin();
}
 
var notice = Factory.NoticeFactory();
var toast = Factory.ToastFactory();
var warnin = Factory.WarninFactory();
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方法进行拆分

交由其子类也就是createToast方法实现

而将所有工厂入口拆成独立工厂类,之前的简单工厂模式在新增时需要修改工厂类,违反了开关原则

工厂模式保证新增时只做添加不做修改

项目足够大时,你可以将Factory和Dialog的子类拆成文件进行管理

在写工厂模式的这段时间,查了一些资料,发现每个人都有自己的理解

看到的一些工厂模式的demo更像是我们前面介绍简单工厂模式,为什么呢?

我们的demo参考的是java的书籍,这里面包含了抽象类这个概念,在前端只能靠自己的理解去描述

所以我们尽力通过一些差别来具体的介绍每一种模式

这里面的例子可能不是特别严谨,我后面会慢慢优化,写的详细一些只有一个目的

当有一天有人问我简单工厂模式和工厂模式的区别在哪,我希望我能给出一个我的理解

工厂模式总结:

优点:
* 增加新产品时,无需修改已存在的代码
* 只暴露工厂类,对具体实现封装在内部,使用时无需关注内部使用

缺点:
* 新增时还是需要新增具体实现以及提供具体的工厂类,一定程度增加了系统复杂度,会带来一些额外开销
* 每个工厂只生产一种产品,会导致存在大量的工厂类,大大增加了系统的维护成本和运行开销

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

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

Javascript 相关文章推荐
一些技巧性实用js代码小结
Oct 14 Javascript
删除select中所有option选项jquery代码
Aug 12 Javascript
浅谈JavaScript函数参数的可修改性问题
Dec 05 Javascript
AngularJS语法详解(续)
Jan 23 Javascript
BootStrap中Datetimepicker和uploadify插件应用实例小结
May 26 Javascript
React实现双向绑定示例代码
Sep 19 Javascript
详细讲解JavaScript中的this绑定
Oct 10 Javascript
Bootstrap 网格系统布局详解
Mar 19 Javascript
vue检测对象和数组的变化分析
Jun 30 Javascript
原生js实现获取form表单数据代码实例
Mar 27 Javascript
微信小程序实现购物车小功能
Dec 30 Javascript
vue 把二维或多维数组转一维数组
Apr 24 Vue.js
javascript设计模式 ? 简单工厂模式原理与应用实例分析
Apr 09 #Javascript
javascript设计模式 ? 单例模式原理与应用实例分析
Apr 09 #Javascript
微信小程序纯文本实现@功能
Apr 08 #Javascript
JavaScript 俄罗斯方块游戏实现方法与代码解释
Apr 08 #Javascript
vue与iframe之间的信息交互的实现
Apr 08 #Javascript
Javascript摸拟自由落体与上抛运动原理与实现方法详解
Apr 08 #Javascript
antd-mobile ListView长列表的数据更新遇到的坑
Apr 08 #Javascript
You might like
PHP中动态HTML的输出技术
2006/10/09 PHP
PHP实现利用MySQL保存session的方法
2014/08/23 PHP
使用正则去除php代码中的注释方法
2016/11/03 PHP
JavaScript 输入框内容格式验证代码
2010/02/11 Javascript
js下获得客户端操作系统的函数代码(1:vista,2:windows7,3:2000,4:xp,5:2003,6:2008)
2011/10/31 Javascript
js实现上传图片之上传前预览图片
2013/03/25 Javascript
js 高效去除数组重复元素示例代码
2013/12/19 Javascript
JavaScript运算符小结
2015/06/03 Javascript
jQuery实现图片上传和裁剪插件Croppie
2015/11/29 Javascript
浅谈js里面的InttoStr和StrtoInt
2016/06/14 Javascript
jquery 实现回车登录详解及实例代码
2016/10/23 Javascript
简单几步实现返回顶部效果
2016/12/05 Javascript
NodeJS自定义模块写法(详解)
2017/06/27 NodeJs
javascript中join方法实例讲解
2019/02/21 Javascript
vue cli3 调用百度翻译API翻译页面的实现示例
2019/09/13 Javascript
图解NodeJS实现登录注册功能
2019/09/16 NodeJs
微信小程序可滑动月日历组件使用详解
2019/10/21 Javascript
微信小程序 生成携带参数的二维码
2019/10/23 Javascript
Vue页面切换和a链接的本质区别详解
2019/11/12 Javascript
微信小程序选择图片控件
2021/01/19 Javascript
Python深入学习之闭包
2014/08/31 Python
Python脚本在Appium库上对移动应用实现自动化测试
2015/04/17 Python
python获得linux下所有挂载点(mount points)的方法
2015/04/29 Python
Python使用struct处理二进制的实例详解
2017/09/11 Python
matplotlib给子图添加图例的方法
2018/08/03 Python
pytorch 求网络模型参数实例
2019/12/30 Python
详解pandas中iloc, loc和ix的区别和联系
2020/03/09 Python
tensorflow 2.0模式下训练的模型转成 tf1.x 版本的pb模型实例
2020/06/22 Python
浅谈多卡服务器下隐藏部分 GPU 和 TensorFlow 的显存使用设置
2020/06/30 Python
使用matplotlib的pyplot模块绘图的实现示例
2020/07/12 Python
python中uuid模块实例浅析
2020/12/29 Python
区域销售经理职责
2013/12/22 职场文书
美国探亲签证邀请信
2014/02/05 职场文书
生日宴会策划方案
2014/06/03 职场文书
社区文明创建工作总结2015
2015/04/21 职场文书
CSS作用域(样式分割)的使用汇总
2021/11/07 HTML / CSS