《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 相关文章推荐
一个简单的JavaScript 日期计算算法
Sep 11 Javascript
基于jQuery的消息提示插件之旅 DivAlert(三)
Apr 01 Javascript
javascript 传统事件模型构造的事件监听器实现代码
May 31 Javascript
javascript 星级评分效果(手写)
Dec 24 Javascript
js Array对象的扩展函数代码
Apr 24 Javascript
js模拟点击以提交表单为例兼容主流浏览器
Nov 29 Javascript
分分钟玩转Vue.js组件(二)
Mar 01 Javascript
JavaScript实现图片无缝滚动效果
Jul 07 Javascript
微信小程序跳转到其他网页(外部链接)的实现方法
Sep 20 Javascript
jQuery实现全选、反选和不选功能的方法详解
Dec 04 jQuery
vue实现匀速轮播效果
Jun 29 Javascript
Vue和React有哪些区别
Sep 12 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
ThinkPHP函数详解之M方法和R方法
2015/09/10 PHP
php获取flash尺寸详细数据的方法
2016/11/12 PHP
PHP单例模式简单用法示例
2017/06/23 PHP
thinkphp框架使用JWTtoken的方法详解
2019/10/10 PHP
javascript中创建对象的三种常用方法
2010/12/30 Javascript
jquery表单验证使用插件formValidator
2012/11/10 Javascript
JS字符串截取函数实例
2013/12/27 Javascript
js出生日期 年月日级联菜单示例代码
2014/01/10 Javascript
vue.js入门教程之计算属性
2016/09/01 Javascript
详解如何较好的使用js
2016/12/16 Javascript
Node.js服务器开启Gzip压缩教程
2017/08/11 Javascript
Angular5中提取公共组件之radio list的实例代码
2018/07/10 Javascript
Angularjs实现数组随机排序的方法
2018/10/02 Javascript
实例讲解JavaScript截取字符串
2018/11/30 Javascript
JS实现checkbox互斥(单选)功能示例
2019/05/04 Javascript
初试vue-cli使用HBuilderx打包app的坑
2019/07/17 Javascript
在layui下对元素进行事件绑定的实例
2019/09/06 Javascript
使用p5.js临摹动态图片
2019/11/04 Javascript
React中使用Vditor自定义图片详解
2020/12/25 Javascript
Python中的列表生成式与生成器学习教程
2016/03/13 Python
深入解析Python中的线程同步方法
2016/06/14 Python
解决Mac下首次安装pycharm无project interpreter的问题
2018/10/29 Python
Python中出现IndentationError:unindent does not match any outer indentation level错误的解决方法
2020/04/18 Python
Python设计模式之装饰模式实例详解
2019/01/21 Python
详解用pyecharts Geo实现动态数据热力图城市找不到问题解决
2019/06/26 Python
Python 写入训练日志文件并控制台输出解析
2019/08/13 Python
python中的split()函数和os.path.split()函数使用详解
2019/12/21 Python
解决python和pycharm安装gmpy2 出现ERROR的问题
2020/08/28 Python
大韩航空官方网站:Korean Air
2017/10/25 全球购物
广州御银科技股份有限公司试卷(C++)
2016/11/04 面试题
.NET里面什么时候需要调用垃圾回收
2015/06/01 面试题
职高毕业生自我鉴定
2013/10/21 职场文书
我们的节日清明节活动方案
2014/03/05 职场文书
优秀教师申报材料
2014/12/16 职场文书
2016年秋季趣味运动会开幕词
2016/03/04 职场文书
实战Python爬虫爬取酷我音乐
2022/04/11 Python