《javascript设计模式》学习笔记五:Javascript面向对象程序设计工厂模式实例分析


Posted in Javascript onApril 08, 2020

本文实例讲述了Javascript面向对象程序设计工厂模式。分享给大家供大家参考,具体如下:

工厂模式和单例模式(https://3water.com/article/184230.htm)应该是设计模式中应用最多的模式了,工厂模式的定义:提供创建对象的接口(来自百度百科:http://baike.baidu.com/view/1306799.htm),意思就是根据领导(调用者)的指示(参数),生产相应的产品(对象)。

1.简单工厂模式

    简单工厂也就是按照上面的定义,根据不同的参数返回不同的结果。

//定义通用的对象类
  var car = function(){};
  //定义对象,对象内容省略,对象必须实现car定义的成员函数(yy一下车^_^)
  var benz = function(){};
  var bmw = function(){};
  var audi = function(){};

  //工厂方法
  var CarFactory = {
    createCar: function(brand){
       //private member of CarFactory
       var car;
       switch(brand){
        case 'benz':
          car = new benz();
          break;
        case 'bmw':
          car = new bmw();
          break;
        case 'audi':
          car = new audi();
          break;
        default:
          car = new bmw();
       }
       //可以不用理会下面这行代码,这里是为了确保所有的品牌汽车都实现了car类的方法
       Interface.ensureImplements(car, Car);
       //返回对象
       return car;
     }
};
//如果我们要获取一部汽车,只需要调用:
var mycar = CarFactory.createCar('bmw');
//不论是什么牌子的汽车,他应该都具有car的所有方法,因此即使不是同样的对象,我们可以“透明”的调用他的方法

2.工厂模式

工厂模式与简单工厂模式的区别在于工厂模式使用子类来创建对象,而不是一个独立的类

//创建一个通用的工厂
var factory = function(){};
factory.prototype = {
  sellcar: function(brand){
    var car = this.createCar(brand);
    return car;
  },
  createCar: function(){
    throw new Error('unsupported operation on an abstract class');
  }
}

//北汽集团
var BJfactory = function(){};
//继承自factory,请参考https://3water.com/article/184227.htm面向对象之二继承)
extend(BJfactory,factory);
//重写汽车方法
BJfactory.prototype.createCar = function(brand){
  var car;
  switch(brand){
   case 'bmw':
     car = new BJbmw();
     break;
   case 'benz':
     car = new BJbenz();
     break;
   case 'audi':
     car = new BJaudi();
     break;
   default:
     car = new BJbmw();
  }
  Interface.ensureImplements(car, Car);
  return car;
}
//上汽
var SHfactory = function();
extend(SHfactory, factory);
//形式同北汽
……

//这样一来,您在北京买车
var fac = new BJfactory();
//调用父类方法
var mycar = fac.sellcar('benz');
//在上海买车
fac = new SHfactory();
hercar = fac.sellcar('audi');
//注意标红的两行调用,调用者都是fac,其实是factory的两个不同子类,但是调用方法都一样,这就是工厂方法的使用

3.类比PHP(希望有助于理解1,2的内容,下面的类名只是实例,并非真实存在)

如果熟悉PHP的同学,也应该了解像PHP的数据库类一般也是工厂模式,形如:

$db = DataBase.getInstance('mysql');
//这里的$db其实是new Mysql(),而无论是class Mysql,还是class Oracle,还是class MSsql都实现了下面的connect,query方法

$db->connect();
$db->query($sql);

感兴趣的朋友可以使用在线HTML/CSS/JavaScript代码运行工具:http://tools.3water.com/code/HtmlJsRun测试上述代码运行效果。

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

Javascript 相关文章推荐
jquery插件jbox使用iframe关闭问题
Feb 09 Javascript
JQuery触发事件例如click
Sep 11 Javascript
Javascript验证用户输入URL地址是否为空及格式是否正确
Oct 09 Javascript
javascript引擎长时间独占线程造成卡顿的解决方案
Dec 03 Javascript
zTree插件下拉树使用入门教程
Apr 11 Javascript
javascript函数中的3个高级技巧
Sep 22 Javascript
AngularJS模仿Form表单提交的实现代码
Dec 08 Javascript
JS实现淡入淡出图片效果的方法分析
Dec 20 Javascript
微信小程序movable view移动图片和双指缩放实例代码
Aug 08 Javascript
jQuery实现的简单动态添加、删除表格功能示例
Sep 21 jQuery
node.js中路由,中间件,ge请求和post请求的参数详解
Dec 26 Javascript
利用es6 new.target来对模拟抽象类的方法
May 10 Javascript
vue实现表单未编辑或未保存离开弹窗提示功能
Apr 08 #Javascript
JS快速实现简单计算器
Apr 08 #Javascript
javascript中contains是否包含功能实现代码(扩展字符、数组、dom)
Apr 07 #Javascript
vue-cli3单页构建大型项目方案
Apr 07 #Javascript
在Chrome DevTools中调试JavaScript的实现
Apr 07 #Javascript
《javascript设计模式》学习笔记四:Javascript面向对象程序设计链式调用实例分析
Apr 07 #Javascript
详解vue中在循环中使用@mouseenter 和 @mouseleave事件闪烁问题解决方法
Apr 07 #Javascript
You might like
在apache下限制每个虚拟主机的并发数!!!!
2006/10/09 PHP
php中将汉字转换成拼音的函数代码
2012/09/08 PHP
php调用MySQL存储过程的方法集合(推荐)
2013/07/03 PHP
php面向对象中static静态属性与方法的内存位置分析
2015/02/08 PHP
php实现学生管理系统
2020/03/21 PHP
浅谈php中的访问修饰符private、protected、public的作用范围
2016/11/20 PHP
PHP验证类的封装与使用方法详解
2019/01/10 PHP
XAMPP升级PHP版本实现步骤解析
2020/09/04 PHP
基于jquery的复制网页内容到WORD的实现代码
2011/02/16 Javascript
常用的JavaScript验证正则表达式汇总
2013/11/26 Javascript
js读取配置文件自写
2014/02/11 Javascript
当滚动条滚动到页面底部自动加载增加内容的js代码
2014/05/13 Javascript
快速获取/设置iframe内对象元素的几种js实现方法
2016/05/20 Javascript
JavaScript中使用webuploader实现上传视频功能(demo)
2017/04/10 Javascript
react-native 完整实现登录功能的示例代码
2017/09/11 Javascript
详解解决使用axios发送json后台接收不到的问题
2018/06/27 Javascript
在vue中使用v-bind:class的选项卡方法
2018/09/27 Javascript
vue实现拖拽的简单案例 不超出可视区域
2019/07/25 Javascript
vue使用swiper实现中间大两边小的轮播图效果
2019/11/24 Javascript
Vue实现背景更换颜色操作
2020/07/17 Javascript
[00:18]天涯墨客三技能展示
2018/08/25 DOTA
Python读大数据txt
2016/03/28 Python
详解Django 中是否使用时区的区别
2018/06/14 Python
python redis 删除key脚本的实例
2019/02/19 Python
Python项目 基于Scapy实现SYN泛洪攻击的方法
2019/07/23 Python
Python jieba库用法及实例解析
2019/11/04 Python
关于Numpy中的行向量和列向量详解
2019/11/30 Python
Python之关于类变量的两种赋值区别详解
2020/03/12 Python
python中常见错误及解决方法
2020/06/21 Python
GUESS德国官网:美国牛仔服装品牌
2017/02/14 全球购物
Bandier官网:奢侈、时尚前卫的健身服装首选目的地
2020/07/05 全球购物
函授本科毕业自我鉴定
2013/10/09 职场文书
物理课外活动总结
2014/08/27 职场文书
世界文化遗产导游词
2015/02/13 职场文书
民事辩护词范文
2015/05/21 职场文书
MySQL索引失效的典型案例
2021/06/05 MySQL