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 相关文章推荐
使用Microsoft Ajax Minifier减小JavaScript文件大小的方法
Apr 01 Javascript
关于scrollLeft,scrollTop的浏览器兼容性测试
Mar 19 Javascript
js或jquery实现页面打印可局部打印
Mar 27 Javascript
JavaScript排序算法之希尔排序的2个实例
Apr 04 Javascript
javascript实现全角与半角字符的转换
Jan 07 Javascript
jQuery实现的背景动态变化导航菜单效果
Aug 24 Javascript
探析浏览器执行JavaScript脚本加载与代码执行顺序
Jan 12 Javascript
Javascript技术栈中的四种依赖注入详解
Feb 23 Javascript
JavaScript的==运算详解
Jul 20 Javascript
JS公共小方法之判断对象是否为domElement的实例
Nov 25 Javascript
解决IE7中使用jQuery动态操作name问题
Aug 28 jQuery
atom-design(Vue.js移动端组件库)手势组件使用教程
May 16 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 Undefined index报错的修复方法
2011/07/17 PHP
3个PHP多维数组转为一维数组的方法实例
2014/03/13 PHP
PHP使用mysqli操作MySQL数据库的简单方法
2017/02/04 PHP
让whoops帮我们告别ThinkPHP6的异常页面
2020/03/02 PHP
用JavaScript编写COM组件的步骤
2009/03/17 Javascript
jquery 倒计时效果实现秒杀思路
2013/09/11 Javascript
JavaScript动态操作表格实例(添加,删除行,列及单元格)
2013/11/25 Javascript
jquery获取html元素的绝对位置和相对位置的方法
2014/06/20 Javascript
JS组件Bootstrap实现下拉菜单效果代码
2016/04/26 Javascript
JavaScript中boolean类型之三种情景实例代码
2016/11/21 Javascript
jQuery中layer分页器的使用
2017/03/13 Javascript
Angular实现图片裁剪工具ngImgCrop实践
2017/08/17 Javascript
Node.js使用cookie保持登录的方法
2018/05/11 Javascript
详解在不使用ssr的情况下解决Vue单页面SEO问题
2018/11/08 Javascript
Vue项目配置跨域访问和代理proxy设置方式
2020/09/08 Javascript
vue 二维码长按保存和复制内容操作
2020/09/22 Javascript
python中字符串类型json操作的注意事项
2017/05/02 Python
同时安装Python2 &amp; Python3 cmd下版本自由选择的方法
2017/12/09 Python
TensorFlow实现简单卷积神经网络
2018/05/24 Python
python assert的用处示例详解
2019/04/01 Python
一行Python代码过滤标点符号等特殊字符
2019/08/12 Python
如何理解python面向对象编程
2020/06/01 Python
详解pandas获取Dataframe元素值的几种方法
2020/06/14 Python
Selenium之模拟登录铁路12306的示例代码
2020/07/31 Python
简述进程的启动、终止的方式以及如何进行进程的查看
2014/02/20 面试题
奖学金自我鉴定范文
2013/10/03 职场文书
幼儿园元旦亲子活动方案
2014/02/17 职场文书
学习方法演讲稿
2014/05/10 职场文书
保护环境倡议书500字
2014/05/19 职场文书
应届大专生自荐书
2014/06/16 职场文书
经典毕业生求职信
2014/07/12 职场文书
教师党员群众路线教育实践活动心得体会
2014/11/04 职场文书
2015关于重阳节的演讲稿
2015/03/20 职场文书
银行安全保卫工作总结
2015/08/10 职场文书
python numpy中multiply与*及matul 的区别说明
2021/05/26 Python
php png失真的原因及解决办法
2021/10/24 PHP