JavaScript设计模式之工厂模式和抽象工厂模式定义与用法分析


Posted in Javascript onJuly 26, 2018

本文实例讲述了JavaScript设计模式之工厂模式和抽象工厂模式定义与用法。分享给大家供大家参考,具体如下:

1、工厂模式:

虽然Object构造函数和对象字面量都可以用来创建单个对象,但这个方式有个明显的缺点:使用同一个接口创建很多对象,会产生大量重复的代码。为了解决这个问题,开始使用工厂模式。

利用工厂模式,可以实现不指定特定的类而创建出对象,也就是说,不需要使用new关键字来创建特定类或子类的实例。

var TravelTeam = function(){};
TravelTeam.prototype = {
 register : function(model){
  var person;
  switch(type){
   case "student":
    person = new Student();
    break;
   case "teacher":
    person = new Teacher();
    break;
   default:
    person = new Doctor();
    break;
  }
  return person;
 }
}
var team = new TravelTeam();
team.register(student");

问题:大多数情形下使用没有问题,但扩展性不好,如需要添加一些新的队员类型,必须修改switch部分。

解决:工厂模式,把相同的部分单独出来交给一个简单的工厂对象:

var TeamFactory = {
 createTeam:function(type){
  var person;
  switch(type){
   case "student":
    person = new Student();
    break;
   case "teacher":
    person = new Teacher();
    break;
   default:
    person = new Doctor();
    break;
  }
  return person;
 }
}

TeamFactory是一个脱离于TravelTeam的单体,能降低耦合度,当需要添加一些新的队员类型的时候,只要修改TeamFactory工厂单体对象就行。

var TravelTeam = function(){};
TravelTeam.prototype = {
 register:function(type){
  var person = TeamFactory.createTeam(type);
  return person;
 }
}

工厂模式的问题:虽然解决了创建多个相似对象的问题,但却没有解决对象识别的问题(即不知道对象的类型)。

解决:构造器模式,请见://3water.com/article/144495.htm。

2、抽象工厂模式

在工厂模式的基础上进行更高层次的抽象,根据共同的用途或主题来抽象出一个最高层基础工厂类,其他具有相似行为的工厂类将继承于此工厂类。

最典型的例子是了解HTML5与HTML4表单域的不同之处后,抽象出最高层的表单域工厂类,HTML5表单域工厂类和HTML4表单域工厂类都继承自该类。

工厂模式与抽象工厂模式的不同:

① 当需要在代码的其余所有部分通过屏蔽较为复杂的对象创建方法来简化某些特定对象的创建过程时,使用工厂模式很适合;

② 当需要从现有代码中的多个类中,根据这些类之间共有的目的或通用的主题,创建出一个额外的抽象层,以降低应用程序的其余开发工作的复杂性时,使用抽象工厂模式很适合。

更多关于JavaScript相关内容可查看本站专题:《javascript面向对象入门教程》、《JavaScript切换特效与技巧总结》、《JavaScript查找算法技巧总结》、《JavaScript错误与调试技巧总结》、《JavaScript数据结构与算法技巧总结》、《JavaScript遍历算法与技巧总结》及《JavaScript数学运算用法总结》

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
jQuery调用WebService的实现代码
Jun 19 Javascript
cookie的复制与使用记住用户名实现代码
Nov 04 Javascript
jQuery控制TR显示隐藏的几种方法
Jun 18 Javascript
Node.js实现数据推送
Apr 14 Javascript
js只执行1次的函数示例
Jul 20 Javascript
在js里怎么实现Xcode里的callFuncN方法(详解)
Nov 05 Javascript
javascript实现用户点击数量统计
Dec 25 Javascript
Vuex利用state保存新闻数据实例
Jun 28 Javascript
PHP 实现一种多文件上传的方法
Sep 20 Javascript
web前端开发中常见的多列布局解决方案整理(一定要看)
Oct 15 Javascript
JavaScript 中的12种循环遍历方法【总结】
May 31 Javascript
使用vue实现各类弹出框组件
Jul 03 Javascript
vue父组件异步获取数据传给子组件的方法
Jul 26 #Javascript
JavaScript设计模式之构造器模式(生成器模式)定义与用法实例分析
Jul 26 #Javascript
JavaScript设计模式之单例模式原理与用法实例分析
Jul 26 #Javascript
JavaScript设计模式之原型模式分析【ES5与ES6】
Jul 26 #Javascript
如何把vuejs打包出来的文件整合到springboot里
Jul 26 #Javascript
JavaScript中变量提升与函数提升经典实例分析
Jul 26 #Javascript
基于Vue实现微信小程序的图文编辑器
Jul 25 #Javascript
You might like
Windows下Apache + PHP SESSION丢失的解决过程全纪录
2015/04/07 PHP
Yii使用技巧大汇总
2015/12/29 PHP
PHP设计模式之装饰器模式实例详解
2018/02/07 PHP
用正则获取指定路径文件的名称
2007/02/27 Javascript
FormValidate 表单验证功能代码更新并提供下载
2008/08/23 Javascript
jquery中ajax调用json数据的使用说明
2011/03/17 Javascript
jQuery操作CheckBox的方法介绍(选中,取消,取值)
2014/02/04 Javascript
jquery实现全选功能效果的实现代码
2016/05/05 Javascript
JavaScript 对象详细整理总结
2016/09/29 Javascript
ES6通过babel转码使用webpack使用import关键字
2016/12/13 Javascript
微信小程序 用户数据解密详细介绍
2017/01/09 Javascript
javascript 数据存储的常用函数总结
2017/06/01 Javascript
详解Vue微信公众号开发踩坑全记录
2017/08/21 Javascript
javascript trie前缀树的示例
2018/01/29 Javascript
JS实现不用中间变量temp 实现两个变量值得交换方法
2018/02/04 Javascript
简单了解TypeScript中如何继承 Error 类
2019/06/21 Javascript
微信小程序实现上传照片代码实例解析
2020/08/04 Javascript
Vue实现简单的留言板
2020/10/23 Javascript
jquery实现异步文件上传ajaxfileupload.js
2020/10/23 jQuery
[01:46]DOTA2上海特锦赛小组赛英文解说KotlGuy采访
2016/02/27 DOTA
python实现登陆知乎获得个人收藏并保存为word文件
2015/03/16 Python
Python 操作文件的基本方法总结
2017/08/10 Python
python中requests使用代理proxies方法介绍
2017/10/25 Python
python2.7读取文件夹下所有文件名称及内容的方法
2018/02/24 Python
python 将字符串完成特定的向右移动方法
2019/06/11 Python
详解Python3定时器任务代码
2019/09/23 Python
使用Python打造一款间谍程序的流程分析
2020/02/21 Python
解决python 虚拟环境删除包无法加载的问题
2020/07/13 Python
怎样让char类型的东西转换成int类型
2013/12/09 面试题
生物化学研究助理员求职信
2013/10/09 职场文书
心得体会开头
2014/01/01 职场文书
全民健身日活动方案
2014/01/29 职场文书
大学生就业策划书范文
2014/04/04 职场文书
推广普通话演讲稿
2014/05/23 职场文书
2015企业年终工作总结范文
2015/05/27 职场文书
MySQL 不等于的三种使用及区别
2021/06/03 MySQL