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 相关文章推荐
jQuery1.6 正式版发布并提供下载
May 05 Javascript
jquery学习笔记 用jquery实现无刷新登录
Aug 08 Javascript
jqueyr判断checkbox组的选中(示例代码)
Nov 08 Javascript
web前端设计师们常用的jQuery特效插件汇总
Dec 07 Javascript
JavaScript仿微博发布信息案例
Nov 16 Javascript
jquery pagination分页插件使用详解(后台struts2)
Jan 22 Javascript
js下载文件并修改文件名
May 08 Javascript
深入解析Vue 组件命名那些事
Jul 18 Javascript
4个顶级开源JavaScript图表库
Sep 29 Javascript
基于javascript实现贪吃蛇经典小游戏
Apr 10 Javascript
webpack 最佳配置指北(推荐)
Jan 07 Javascript
javascript canvas实现雨滴效果
Jun 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
当年上海收录机产品生产,进口和价格情况
2021/03/04 无线电
PHP header函数分析详解
2011/08/06 PHP
html静态页面调用php文件的方法
2014/11/13 PHP
yii,CI,yaf框架+smarty模板使用方法
2015/12/29 PHP
PHP实现的简单路由和类自动加载功能
2018/03/13 PHP
php回调函数处理数组操作示例
2020/04/13 PHP
PHP Ajax跨域问题解决方案代码实例
2020/08/01 PHP
基于jQuery的左右滚动实现代码
2010/12/03 Javascript
jQuery方法简洁实现隔行换色及toggleClass的使用
2013/03/15 Javascript
JQuery+DIV自定义滚动条样式的具体实现
2013/06/25 Javascript
Jquery获取复选框被选中值的简单方法
2013/07/04 Javascript
js通过八个点 拖动改变div大小的实现方法
2014/03/05 Javascript
JS实现局部选择打印和局部不选择打印
2014/04/03 Javascript
JavaScript加入收藏夹功能(兼容IE、firefox、chrome)
2014/05/05 Javascript
jQuery中replaceWith()方法用法实例
2014/12/25 Javascript
js实现点击切换TAB标签实例
2015/08/21 Javascript
javascript如何写热点图
2015/12/08 Javascript
实现高性能JavaScript之执行与加载
2016/01/30 Javascript
vue页面切换到滚动页面显示顶部的实例
2018/03/13 Javascript
nodejs中实现修改用户路由功能
2019/05/24 NodeJs
Python中字典创建、遍历、添加等实用操作技巧合集
2015/06/02 Python
python3.6的venv模块使用详解
2018/08/01 Python
python自动发邮件总结及实例说明【推荐】
2019/05/31 Python
基于Python的微信机器人开发 微信登录和获取好友列表实现解析
2019/08/21 Python
解决TensorFlow GPU版出现OOM错误的问题
2020/02/03 Python
Python类中self参数用法详解
2020/02/13 Python
详解django中Template语言
2020/02/22 Python
HTML利用九宫格原理进行网页布局
2020/03/13 HTML / CSS
日本非常有名的内衣丝袜品牌:GUNZE
2017/01/06 全球购物
童装店创业计划书
2014/01/09 职场文书
信息与计算科学专业推荐信
2014/02/23 职场文书
元旦促销方案
2014/03/15 职场文书
高二学生评语大全
2014/04/25 职场文书
欢迎横幅标语
2014/06/17 职场文书
2015年派出所工作总结
2015/04/24 职场文书
灵魂歌王观后感
2015/06/17 职场文书