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 相关文章推荐
DWZ刷新dialog解决方法
Mar 03 Javascript
JS对select控件option选项的增删改查示例代码
Oct 21 Javascript
jQuery向后台传入json格式数据的方法
Feb 13 Javascript
JavaScript中setMonth()方法的使用详解
Jun 11 Javascript
JavaScript中eval()函数用法详解
Dec 14 Javascript
原生态js,鼠标按下后,经过了那些单元格的简单实例
Aug 11 Javascript
用原生js做单页应用
Jan 17 Javascript
JS点击动态添加标签、删除指定标签的代码
Apr 18 Javascript
浅谈vue-router路由切换 组件重用挖下的坑
Nov 01 Javascript
JavaScript setInterval()与setTimeout()计时器
Dec 27 Javascript
JS数组及对象遍历方法代码汇总
Jun 16 Javascript
Ant Design的Table组件去除
Oct 24 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
定制404错误页面,并发信给管理员的程序
2006/10/09 PHP
一个改进的UBB类
2006/10/09 PHP
mysql limit查询优化分析
2008/11/12 PHP
PHP小程序支付功能完整版【基于thinkPHP】
2019/03/26 PHP
Laravel框架模型的创建及模型对数据操作示例
2019/05/07 PHP
JavaScript/jQuery 表单美化插件小结
2012/02/14 Javascript
JS子父窗口互相操作取值赋值的方法介绍
2013/05/11 Javascript
jQuery CSS()方法改变现有的CSS样式表
2014/09/09 Javascript
Node.js文件操作方法汇总
2016/03/22 Javascript
jquery仿QQ登录账号选择下拉框效果
2016/03/22 Javascript
浅析js绑定事件的常用方法
2016/05/15 Javascript
使用JavaScript判断用户输入的是否为正整数(两种方法)
2017/02/05 Javascript
jQuery实现级联下拉框实战(5)
2017/02/08 Javascript
jQuery树控件zTree使用方法详解(一)
2017/02/28 Javascript
javascript实现动态显示颜色块的报表效果
2017/04/10 Javascript
axios 处理 302 状态码的解决方法
2018/04/10 Javascript
AngularJs中$cookies简单用法分析
2019/05/30 Javascript
JS forEach跳出循环2种实现方法
2020/06/24 Javascript
tornado捕获和处理404错误的方法
2014/02/26 Python
Python实现的数据结构与算法之双端队列详解
2015/04/22 Python
python自动化报告的输出用例详解
2018/05/30 Python
在python中pandas读文件,有中文字符的方法
2018/12/12 Python
Python设计模式之命令模式原理与用法实例分析
2019/01/11 Python
nginx+uwsgi+django环境搭建的方法步骤
2019/11/25 Python
用Python生成HTML表格的方法示例
2020/03/06 Python
Python读写操作csv和excle文件代码实例
2020/03/16 Python
Selenium alert 弹窗处理的示例代码
2020/08/06 Python
python FTP编程基础入门
2021/02/27 Python
中专生的个人自我评价
2013/12/11 职场文书
厂长助理岗位职责
2013/12/27 职场文书
优质服务口号
2014/06/11 职场文书
会计个人实习计划书
2014/08/15 职场文书
师德师风整改措施
2014/10/24 职场文书
工程项目经理岗位职责
2015/02/02 职场文书
商场圣诞节活动总结
2015/05/06 职场文书
《月光曲》教学反思
2016/02/16 职场文书