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 相关文章推荐
关于实现代码语法标亮 dp.SyntaxHighlighter
Feb 02 Javascript
JS的数组的扩展实例代码
Jul 09 Javascript
javascript 去字符串空格终极版(支持utf8)
Nov 14 Javascript
setTimeout自动触发一个js的方法
Jan 15 Javascript
js创建对象的区别示例介绍
Jul 24 Javascript
《JavaScript函数式编程》读后感
Aug 07 Javascript
js实现有过渡渐变效果的图片轮播相册(兼容IE,ff)
Jan 19 Javascript
有关jquery与DOM节点操作方法和属性记录
Apr 15 Javascript
ECHO.js 纯javascript轻量级延迟加载的实例代码
May 24 Javascript
node.js入门学习之url模块
Feb 25 Javascript
JS实现全屏预览F11功能的示例代码
Jul 23 Javascript
vue使用原生swiper代码实例
Feb 05 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 5.0对象模型深度探索之类的静态成员
2008/03/27 PHP
FleaPHP的安全设置方法
2008/09/15 PHP
php 文件缓存函数
2011/10/08 PHP
php使用session二维数组实例
2014/11/06 PHP
PHP实现阿里大鱼短信验证的实例代码
2017/07/10 PHP
让whoops帮我们告别ThinkPHP6的异常页面
2020/03/02 PHP
jquery简单体验
2007/01/10 Javascript
javascript开发中因空格引发的错误
2010/11/08 Javascript
js 函数的副作用分析
2011/08/23 Javascript
jQuery中setTimeout的几种使用方法小结
2013/04/07 Javascript
jquery 表格排序、实时搜索表格内容(附图)
2014/05/19 Javascript
JavaScript控制按钮可用或不可用的方法
2015/04/03 Javascript
JavaScript中的splice()方法使用详解
2015/06/09 Javascript
jquery实现先淡出再折叠收起的动画效果
2015/08/07 Javascript
vue自定义移动端touch事件之点击、滑动、长按事件
2018/07/10 Javascript
vue 项目地址去掉 #的方法
2018/10/20 Javascript
微信小程序时间戳转日期的详解
2019/04/30 Javascript
少女风vue组件库的制作全过程
2019/05/15 Javascript
Vue项目总结之webpack常规打包优化方案
2019/06/06 Javascript
Layui tree 下拉菜单树的实例代码
2019/09/21 Javascript
JS性能优化实现方法及优点进行
2020/08/30 Javascript
[02:22]2018DOTA2亚洲邀请赛VG赛前采访
2018/04/03 DOTA
[45:59]EG vs OG 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
Python标准库内置函数complex介绍
2014/11/25 Python
python批量下载网站马拉松照片的完整步骤
2018/12/05 Python
Python学习笔记之图片人脸检测识别实例教程
2019/03/06 Python
关于sys.stdout和print的区别详解
2019/12/05 Python
Python 中Operator模块的使用
2021/01/30 Python
Java语言程序设计测试题改错题部分
2014/07/22 面试题
演讲开场白台词大全
2015/05/29 职场文书
2015年学校少先队工作总结
2015/07/20 职场文书
会计主管竞聘书
2015/09/15 职场文书
2019年暑期法院实习报告
2019/12/18 职场文书
python某漫画app逆向
2021/03/31 Python
浏览器常用基本操作之python3+selenium4自动化测试(基础篇3)
2021/05/21 Python
Spring Data JPA框架Repository自定义实现
2022/04/28 Java/Android