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代码要注意的几条规则
Sep 10 Javascript
探讨在JQuery和Js中,如何让ajax执行完后再继续往下执行
Jul 09 Javascript
js实现上传图片预览的方法
Feb 09 Javascript
JavaScript是如何实现继承的(六种方式)
Mar 31 Javascript
JQuery点击事件回到页面顶部效果的实现代码
May 24 Javascript
jQuery实现倒计时重新发送短信验证码功能示例
Jan 12 Javascript
js仿小米手机上下滑动效果
Feb 05 Javascript
Bootstrap Scrollspy源码学习
Mar 02 Javascript
vue的keep-alive中使用EventBus的方法
Apr 23 Javascript
浅谈Vue的响应式原理
May 30 Javascript
layui radio单选限制下一个radio单选的实例
Sep 03 Javascript
vue 取出v-for循环中的index值实例
Nov 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
antd-mobile ListView长列表的数据更新遇到的坑
Apr 08 #Javascript
You might like
php正则
2006/07/07 PHP
简单的php 验证图片生成函数
2009/05/21 PHP
php 搜索框提示(自动完成)实例代码
2012/02/05 PHP
php删除数组中重复元素的方法
2015/12/22 PHP
浅谈PHP进程管理
2019/03/08 PHP
jquery ajax 同步异步的执行示例代码
2010/06/23 Javascript
jquery ui dialog实现弹窗特效的思路及代码
2013/08/03 Javascript
JS实现淘宝支付宝网站的控制台菜单效果
2015/09/28 Javascript
javascript弹出窗口实现代码
2015/11/12 Javascript
JavaScript中实现键值对应的字典与哈希表结构的示例
2016/06/12 Javascript
基于js里调用函数时,函数名带括号和不带括号的区别
2016/07/28 Javascript
jQuery File Upload文件上传插件使用详解
2016/12/06 Javascript
node.js与C语言 实现遍历文件夹下最大的文件,并输出路径,大小
2017/01/20 Javascript
jQuery使用ajax_动力节点Java学院整理
2017/07/05 jQuery
JS按条件 serialize() 对应标签的使用方法
2017/07/24 Javascript
详解AngularJS之$window窗口对象
2018/01/17 Javascript
vue+webpack实现异步组件加载的方法
2018/02/03 Javascript
ES6 系列之 Generator 的自动执行的方法示例
2018/10/19 Javascript
vuex 解决报错this.$store.commit is not a function的方法
2018/12/17 Javascript
不刷新网页就能链接新的js文件方法总结
2020/03/01 Javascript
在Python的setuptools框架下生成egg的教程
2015/04/13 Python
Python实现获取命令行输出结果的方法
2017/06/10 Python
spark: RDD与DataFrame之间的相互转换方法
2018/06/07 Python
python迭代dict的key和value的方法
2018/07/06 Python
在Python中获取操作系统的进程信息
2019/08/27 Python
Python 读取WAV音频文件 画频谱的实例
2020/03/14 Python
Python面向对象程序设计之继承、多态原理与用法详解
2020/03/23 Python
numpy的Fancy Indexing和array比较详解
2020/06/11 Python
css3中仿放大镜效果的几种方式原理解析
2020/12/03 HTML / CSS
你不知道的5个HTML5新功能
2016/06/28 HTML / CSS
Pretty Little Thing爱尔兰:时尚女性服饰
2017/03/27 全球购物
Swanson中国官网:美国斯旺森健康产品公司
2021/03/01 全球购物
大学新生军训感言
2014/02/25 职场文书
求职信内容怎么写
2014/05/26 职场文书
公司开除员工通知
2015/04/22 职场文书
springboot应用服务启动事件的监听实现
2022/04/06 Java/Android