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获取键盘按键响应事件(兼容各浏览器)
May 16 Javascript
JavaScript中变量声明有var和没var的区别示例介绍
Sep 15 Javascript
JavaScript常用脚本汇总(三)
Mar 04 Javascript
JavaScript控制table某列不显示的方法
Mar 16 Javascript
JS实现把鼠标放到链接上出现滚动文字的方法
Apr 06 Javascript
AngularJS 指令详细介绍
Jul 27 Javascript
vue.js实现含搜索的多种复选框(附源码)
Mar 23 Javascript
Django+Vue实现WebSocket连接的示例代码
May 28 Javascript
pm2启动ssr失败的解决方法
Jun 29 Javascript
纯js+css实现仿移动端淘宝网站的弹出详情框功能
Dec 29 Javascript
JS数组方法some、every和find的使用详情
Oct 05 Javascript
vue3.0 数字翻牌组件的使用方法详解
Apr 20 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中文件缓存转内存缓存的方法
2011/12/06 PHP
PHP函数实现分页含文本分页和数字分页
2014/10/23 PHP
PHP操作MySQL事务实例
2014/11/05 PHP
php面向对象值单例模式
2016/05/03 PHP
CI框架入门之MVC简单示例
2016/11/21 PHP
php格式化时间戳
2016/12/17 PHP
YII2 实现多语言配置的方法分享
2017/01/11 PHP
Yii2实现UploadedFile上传文件示例
2017/02/15 PHP
Laravel解决nesting level错误和隐藏index.php的问题
2019/10/12 PHP
php多进程中的阻塞与非阻塞操作实例分析
2020/03/04 PHP
浅析document.createDocumentFragment()与js效率
2013/07/08 Javascript
直接在JS里创建JSON数据然后遍历使用
2014/07/25 Javascript
jquery.uploadify插件在chrome浏览器频繁崩溃解决方法
2015/03/01 Javascript
jquery滚动加载数据的方法
2015/03/09 Javascript
JS根据浏览器窗口大小实时动态改变网页文字大小的方法
2016/02/25 Javascript
微信小程序 for 循环详解
2016/10/09 Javascript
快速掌握jquery分页插件jqPaginator的使用方法
2017/08/09 jQuery
JS随机数产生代码分享
2018/02/24 Javascript
Openlayers绘制地图标注
2020/09/28 Javascript
js实现简易ATM功能
2020/10/27 Javascript
[01:18]DOTA2超级联赛专访hanci ForLove淘汰感言曝光
2013/06/04 DOTA
解决python3在anaconda下安装caffe失败的问题
2017/06/15 Python
Python实现的生产者、消费者问题完整实例
2018/05/30 Python
破解安装Pycharm的方法
2018/10/19 Python
python实现剪切功能
2019/01/23 Python
python3在同一行内输入n个数并用列表保存的例子
2019/07/20 Python
python3获取控制台输入的数据的具体实例
2020/08/16 Python
python 使用xlsxwriter循环向excel中插入数据和图片的操作
2021/01/01 Python
100%植物性、有机、即食餐:Sakara Life
2018/10/25 全球购物
艺术系应届生的自我评价
2013/10/19 职场文书
幼儿园消防演练方案
2014/02/13 职场文书
市场开发计划书
2014/05/07 职场文书
班组建设经验交流材料
2014/05/12 职场文书
单位委托书怎么写
2014/09/21 职场文书
房产公证书样本
2015/01/23 职场文书
Java 死锁解决方案
2022/05/11 Java/Android