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 相关文章推荐
javascript学习笔记(五) Array 数组类型介绍
Jun 19 Javascript
jquery 获取表单元素里面的值示例代码
Jul 28 Javascript
网页实时显示服务器时间和javscript自运行时钟
Jun 09 Javascript
扒一扒JavaScript 预解释
Jan 28 Javascript
js实现鼠标悬停图片上时滚动文字说明的方法
Feb 17 Javascript
jquery实现表单验证简单实例演示
Nov 23 Javascript
JavaScript编写页面半透明遮罩效果的简单示例
May 09 Javascript
jQuery文件上传控件 Uploadify 详解
Jun 20 Javascript
JavaScript中的对象继承关系
Aug 01 Javascript
angularjs实现下拉列表的选中事件示例
Mar 03 Javascript
vue货币过滤器的实现方法
Apr 01 Javascript
webpack组织模块打包Library的原理及实现
Mar 10 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
虫族 Zerg 魔法科技
2020/03/14 星际争霸
php实现可以设置中奖概率的抽奖程序代码分享
2014/01/19 PHP
php断点续传之如何分割合并文件
2014/03/22 PHP
thinkphp3.0输出重复两次的解决方法
2014/12/19 PHP
详解PHP中cookie和session的区别及cookie和session用法小结
2016/06/12 PHP
php微信支付接口开发程序
2016/08/02 PHP
php桥接模式应用案例分析
2019/10/23 PHP
JS常用正则表达式总结
2013/11/12 Javascript
jquery实现页面图片等比例放大缩小功能
2014/02/12 Javascript
JavaScript中的prototype和constructor简明总结
2014/04/05 Javascript
Javascript学习笔记之 对象篇(一) : 对象的使用和属性
2014/06/24 Javascript
js 实现的可折叠留言板(附源码下载)
2014/07/01 Javascript
分享20款美化网站的 jQuery Lightbox 灯箱插件
2014/10/10 Javascript
JS制作手机端自适应缩放显示
2015/06/11 Javascript
3种js实现string的substring方法
2015/11/09 Javascript
浅谈js中的三种继承方式及其优缺点
2016/08/10 Javascript
Bootstrap栅格系统使用方法及页面调整变形的解决方法
2017/03/10 Javascript
springMVC + easyui + $.ajaxFileUpload实现文件上传注意事项
2017/04/23 Javascript
Node.js使用MongoDB的ObjectId作为查询条件的方法
2019/09/10 Javascript
vue3为什么要用proxy替代defineProperty
2020/10/19 Javascript
python list 合并连接字符串的方法
2013/03/09 Python
Python selenium 三种等待方式详解(必会)
2016/09/15 Python
Python环境下安装PyGame和PyOpenGL的方法
2020/03/25 Python
python中sklearn的pipeline模块实例详解
2020/05/21 Python
使用Python下载抖音各大V视频的思路详解
2021/02/06 Python
深入CSS3 动画效果的总结详解
2013/05/09 HTML / CSS
canvas实现图片镜像翻转的2种方式
2020/07/22 HTML / CSS
物理专业本科生自荐信
2014/01/30 职场文书
人力资源经理的岗位职责
2014/03/02 职场文书
先进个人事迹材料范文
2014/12/30 职场文书
手术室护士个人总结
2015/02/13 职场文书
学雷锋献爱心活动总结
2015/05/11 职场文书
学校隐患排查制度
2015/08/05 职场文书
pandas 实现将NaN转换为None
2021/05/14 Python
【DOTA2】高能暴走TK秀!PSG LGD vs ASTER - DPC 2022 WINTER TOUR CN
2022/04/02 DOTA
Mysql索引失效 数据库表中有索引还是查询很慢
2022/05/15 MySQL