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 巧妙获取剪贴板数据 Excel数据的粘贴
Jul 09 Javascript
jQuery asp.net 用json格式返回自定义对象
Apr 07 Javascript
javascript实现根据汉字获取简拼
Sep 25 Javascript
微信小程序 前端源码逻辑和工作流详解
Oct 08 Javascript
使用node.js中的Buffer类处理二进制数据的方法
Nov 26 Javascript
基于JavaScript实现本地图片预览
Feb 08 Javascript
javascript+html5+css3自定义提示窗口
Jun 21 Javascript
JS判断Android、iOS或浏览器的多种方法(四种方法)
Jun 29 Javascript
Vue-cli-webpack搭建斗鱼直播步骤详解
Nov 17 Javascript
JavaScript调用模式与this关键字绑定的关系
Apr 21 Javascript
vue中element 上传功能的实现思路
Jul 06 Javascript
微信小程序动画组件使用解析,类似vue,且更强大
Aug 01 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
ThinkPHP实现将本地文件打包成zip下载
2014/06/26 PHP
PHP队列用法实例
2014/11/05 PHP
php使用Header函数,PHP_AUTH_PW和PHP_AUTH_USER做用户验证
2016/05/04 PHP
PHP面向对象继承用法详解(优化与减少代码重复)
2016/12/02 PHP
javascript打开新窗口同时关闭旧窗口
2009/01/16 Javascript
JavaScript 监听textarea中按键事件
2009/10/08 Javascript
js 表格隔行颜色
2009/12/02 Javascript
简易js代码实现计算器操作
2013/04/15 Javascript
jquery防止重复执行动画避免页面混乱
2014/04/22 Javascript
事件委托与阻止冒泡阻止其父元素事件触发
2014/09/02 Javascript
js用Date对象的setDate()函数对日期进行加减操作
2014/09/18 Javascript
简介JavaScript中POSITIVE_INFINITY值的使用
2015/06/05 Javascript
基于JavaScript如何制作遮罩层对话框
2016/01/26 Javascript
Javascript HTML5 Canvas实现的一个画板
2020/04/12 Javascript
jquery中live()方法和bind()方法区别分析
2016/06/23 Javascript
微信小程序 动态传参实例详解
2017/04/27 Javascript
使用3D引擎threeJS实现星空粒子移动效果
2020/09/13 Javascript
仿ElementUI实现一个Form表单的实现代码
2019/04/23 Javascript
Vue监听页面刷新和关闭功能
2019/06/20 Javascript
Python实现拼接多张图片的方法
2014/12/01 Python
初步理解Python进程的信号通讯
2015/04/09 Python
Python中%r和%s的详解及区别
2017/03/16 Python
Django自定义用户认证示例详解
2018/03/14 Python
python GUI库图形界面开发之PyQt5 Qt Designer工具(Qt设计师)详细使用方法及Designer ui文件转py文件方法
2020/02/26 Python
关于PyCharm安装后修改路径名称使其可重新打开的问题
2020/10/20 Python
Python 将代码转换为可执行文件脱离python环境运行(步骤详解)
2021/01/25 Python
学生干部学习的自我评价
2014/02/18 职场文书
财务会计大学生自我评价
2014/04/09 职场文书
购房协议书
2014/04/11 职场文书
2014年外联部工作总结
2014/11/17 职场文书
付款承诺函范文
2015/01/21 职场文书
运动会开幕式通讯稿
2015/07/18 职场文书
解析原生JS getComputedStyle
2021/05/25 Javascript
OpenCV-Python 实现两张图片自动拼接成全景图
2021/06/11 Python
python标准库ElementTree处理xml
2022/05/20 Python
Python 中面向接口编程
2022/05/20 Python