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 相关文章推荐
javascript 强制刷新页面的实现代码
Dec 13 Javascript
jquery数组过滤筛选方法grep()简介
Jun 06 Javascript
jquery层级选择器(匹配父元素下的子元素实现代码)
Sep 05 Javascript
JavaScript 闭包详细介绍
Sep 28 Javascript
javascript 判断是否是微信浏览器的方法
Oct 09 Javascript
让浏览器崩溃的12行JS代码(DoS攻击分析及防御)
Oct 10 Javascript
vue如何实现observer和watcher源码解析
Mar 09 Javascript
实例详解JSON取值(key是中文或者数字)方式
Aug 24 Javascript
vue生成token并保存到本地存储中
Jul 17 Javascript
JavaScript交换变量的常用方法小结【4种方法】
May 07 Javascript
js数组中去除重复值的几种方法
Aug 03 Javascript
教你部署vue项目到docker
Apr 05 Vue.js
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数组添加与删除单元的常用函数实例分析
2015/02/16 PHP
PHP在弹框中获取foreach中遍历的id值并传递给地址栏
2017/06/13 PHP
扩展jQuery 键盘事件的几个基本方法
2009/10/30 Javascript
Javascript中Eval函数的使用
2010/03/23 Javascript
js setTimeout opener的用法示例详解
2013/10/23 Javascript
解析JavaScript中的不可见数据类型
2013/12/02 Javascript
JavaScript将Web页面内容导出到Word及Excel的方法
2015/02/13 Javascript
js时钟翻牌效果实现代码分享
2020/07/31 Javascript
js模拟淘宝网的多级选择菜单实现方法
2015/08/18 Javascript
完美的js div拖拽实例代码
2016/09/24 Javascript
Vue.js第四天学习笔记
2016/12/02 Javascript
输入框点击时边框变色效果的实现方法
2016/12/26 Javascript
Js apply方法详解
2017/02/16 Javascript
微信小程序中form 表单提交和取值实例详解
2017/04/20 Javascript
ES6新特性之类(Class)和继承(Extends)相关概念与用法分析
2017/05/24 Javascript
React服务端渲染(总结)
2017/07/01 Javascript
javascript基本常用排序算法解析
2017/09/27 Javascript
微信小程序授权登录及解密unionId出错的方法
2018/09/26 Javascript
JS无限级导航菜单实现方法
2019/01/05 Javascript
详解js中let与var声明变量的区别
2020/04/05 Javascript
微信小程序 腾讯地图显示偏差问题解决
2019/07/27 Javascript
微信小程序常用的3种提示弹窗实现详解
2019/09/19 Javascript
JavaScript Dom 绑定事件操作实例详解
2019/10/02 Javascript
Python计算斗牛游戏概率算法实例分析
2017/09/26 Python
python如何实现int函数的方法示例
2018/02/19 Python
pycharm在调试python时执行其他语句的方法
2018/11/29 Python
python样条插值的实现代码
2018/12/17 Python
pytorch 归一化与反归一化实例
2019/12/31 Python
世界上最大的乐器零售商:Guitar Center
2017/11/07 全球购物
教师绩效工资方案
2014/02/01 职场文书
美丽家庭事迹材料
2014/05/03 职场文书
共产党员岗位承诺书
2014/05/29 职场文书
经济国贸专业求职信
2014/06/18 职场文书
暑假社会实践证明格式
2014/10/28 职场文书
Redis集群节点通信过程/原理流程分析
2022/03/18 Redis
Redis实现一个账号只能登录一个设备
2022/04/19 Redis