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 相关文章推荐
jQuery 动画基础教程
Dec 25 Javascript
jQuery 顺便学习下CSS选择器 奇偶匹配nth-child(even)
May 24 Javascript
获取下拉列表框的值是数组,split,$.inArray示例
Nov 13 Javascript
Jquery创建一个层当鼠标移动到层上面不消失效果
Dec 12 Javascript
jQuery函数map()和each()介绍及异同点分析
Nov 08 Javascript
html的DOM中Event对象onabort事件用法实例
Jan 21 Javascript
JavaScript获取DOM元素的11种方法总结
Apr 25 Javascript
Angularjs通过指令监听ng-repeat渲染完成后执行脚本的方法
Dec 31 Javascript
浅谈Vue路由快照实现思路及其问题
Jun 07 Javascript
angularJs使用ng-repeat遍历后选中某一个的方法
Sep 30 Javascript
详解js动态获取浏览器或页面等容器的宽高
Mar 13 Javascript
Layui之table中的radio在切换分页时无法记住选中状态的解决方法
Sep 02 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
antd-mobile ListView长列表的数据更新遇到的坑
Apr 08 #Javascript
You might like
PHP移动文件指针ftell()、fseek()、rewind()函数总结
2014/11/18 PHP
基于GD2图形库的PHP生成图片缩略图类代码分享
2015/02/08 PHP
php处理单文件、多文件上传代码分享
2016/08/24 PHP
PHP基于cookie实现统计在线人数功能示例
2019/01/16 PHP
Centos7 Yum安装PHP7.2流程教程详解
2019/07/02 PHP
JavaScript动态调整TextArea高度的代码
2010/12/28 Javascript
Jquery同辈元素选中/未选中效果的实例代码
2013/08/01 Javascript
jquery 延迟执行实例介绍
2013/08/20 Javascript
JS生成不重复随机数组的函数代码
2014/06/10 Javascript
JS中事件冒泡和事件捕获介绍
2016/12/13 Javascript
微信小程序 MD5的方法详解及实例代码
2017/03/10 Javascript
javascript 中关于array的常用方法详解
2017/05/05 Javascript
利用jquery去掉时光轴头尾部线条的方法实例
2017/06/16 jQuery
浅谈express 中间件机制及实现原理
2017/08/31 Javascript
手机注册发送验证码倒计时的简单实例
2017/11/15 Javascript
vue3.0 CLI - 3.2 路由的初级使用教程
2018/09/20 Javascript
vue瀑布流组件实现上拉加载更多
2020/03/10 Javascript
ant-design-vue 时间选择器赋值默认时间的操作
2020/10/27 Javascript
[49:21]2018DOTA2亚洲邀请赛3月30日 小组赛B组 Effect VS iG
2018/03/31 DOTA
Python实现网站文件的全备份和差异备份
2014/11/30 Python
Python做简单的字符串匹配详解
2017/03/21 Python
python生成tensorflow输入输出的图像格式的方法
2018/02/12 Python
使用Python实现租车计费系统的两种方法
2018/09/29 Python
numpy np.newaxis 的实用分享
2019/11/30 Python
spyder 在控制台(console)执行python文件,debug python程序方式
2020/04/20 Python
通过实例解析Python RPC实现原理及方法
2020/07/07 Python
Python requests接口测试实现代码
2020/09/08 Python
详解HTML5中的标签
2015/06/19 HTML / CSS
Levi’s美国官网:美国著名的牛仔裤品牌
2016/08/19 全球购物
请解释在new与override的区别
2012/10/29 面试题
会计出纳岗位职责
2013/12/25 职场文书
运动会拉拉队口号
2014/06/09 职场文书
工地质量标语
2014/06/12 职场文书
元旦晚会主持词开场白
2015/05/28 职场文书
超级礼物观后感
2015/06/15 职场文书
解决Go gorm踩过的坑
2021/04/30 Golang