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 相关文章推荐
关于锚点跳转及jQuery下相关操作与插件
Oct 01 Javascript
Javascript脚本实现静态网页加密实例代码
Nov 05 Javascript
解决checkbox的attr(checked)一直为undefined问题
Jun 16 Javascript
jQuery使用append在html元素后同时添加多项内容的方法
Mar 26 Javascript
JavaScript求一个数组中重复出现次数最多的元素及其下标位置示例
Jul 23 Javascript
微信小程序实现留言板(Storage)
Nov 02 Javascript
微信小程序下拉框功能的实例代码
Nov 06 Javascript
vue中tab选项卡的实现思路
Nov 25 Javascript
详解js中let与var声明变量的区别
Apr 05 Javascript
对layui初始化列表的CheckBox属性详解
Sep 13 Javascript
微信内置浏览器图片查看器的代码实例
Oct 08 Javascript
微信小程序canvas分享海报功能
Oct 31 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伪造referer实例代码
2008/09/20 PHP
Mac系统下使用brew搭建PHP(LNMP/LAMP)开发环境
2015/03/03 PHP
PHP实现HTTP断点续传的方法
2015/06/17 PHP
详解PHP中的Traits
2015/07/29 PHP
php表单处理操作
2017/11/16 PHP
php实现的生成迷宫与迷宫寻址算法完整实例
2017/11/06 PHP
脚本吧 - 幻宇工作室用到js,超强推荐share.js
2006/12/23 Javascript
range 标准化之获取
2011/08/28 Javascript
js解析与序列化json数据(三)json的解析探讨
2013/02/01 Javascript
jquery prop的使用介绍及与attr的区别
2013/12/19 Javascript
使用js实现数据格式化
2014/12/03 Javascript
jQuery对html元素的取值与赋值实例详解
2015/12/18 Javascript
从零开始做一个pagination分页组件
2017/03/15 Javascript
利用纯JS实现像素逐渐显示的方法示例
2017/08/14 Javascript
Postman环境变量全局变量使用方法详解
2020/08/13 Javascript
Vue为什么要谨慎使用$attrs与$listeners
2020/08/27 Javascript
Python使用metaclass实现Singleton模式的方法
2015/05/05 Python
Django中的“惰性翻译”方法的相关使用
2015/07/27 Python
python基于pygame实现响应游戏中事件的方法(附源码)
2015/11/11 Python
谈谈Python进行验证码识别的一些想法
2016/01/25 Python
python编码最佳实践之总结
2016/02/14 Python
Python实现自动登录百度空间的方法
2017/06/10 Python
终端命令查看TensorFlow版本号及路径的方法
2018/06/13 Python
python实现定时提取实时日志程序
2018/06/22 Python
Python的条件表达式和lambda表达式实例
2019/01/31 Python
详解用python写网络爬虫-爬取新浪微博评论
2019/05/10 Python
对Django中内置的User模型实例详解
2019/08/16 Python
python使用openpyxl操作excel的方法步骤
2020/05/28 Python
Django多数据库联用实现方法解析
2020/11/12 Python
纯CSS3代码实现switch滑动开关按钮效果
2016/08/30 HTML / CSS
共产党员公开承诺践诺书
2014/05/28 职场文书
银行职员工作失误检讨书
2014/10/14 职场文书
2014教师年度工作总结
2014/11/10 职场文书
企业党建工作总结2015
2015/05/26 职场文书
2016年大学校运会广播稿件
2015/12/21 职场文书
2019年度政务公开考核工作总结模板
2019/11/11 职场文书