深入理解JavaScript系列(28):设计模式之工厂模式详解


Posted in Javascript onMarch 03, 2015

介绍

与创建型模式类似,工厂模式创建对象(视为工厂里的产品)时无需指定创建对象的具体类。

工厂模式定义一个用于创建对象的接口,这个接口由子类决定实例化哪一个类。该模式使一个类的实例化延迟到了子类。而子类可以重写接口方法以便创建的时候指定自己的对象类型。

这个模式十分有用,尤其是创建对象的流程赋值的时候,比如依赖于很多设置文件等。并且,你会经常在程序里看到工厂方法,用于让子类类定义需要创建的对象类型。

正文

下面这个例子中,是应用了工厂方法对第26章构造函数模式代码的改进版本:

var Car = (function () {

    var Car = function (model, year, miles) {

        this.model = model;

        this.year = year;

        this.miles = miles;

    };

    return function (model, year, miles) {

        return new Car(model, year, miles);

    };

})();
var tom = new Car("Tom", 2009, 20000);

var dudu = new Car("Dudu", 2010, 5000);

不好理解的话,我们再给一个例子:

var productManager = {};
productManager.createProductA = function () {

    console.log('ProductA');

}
productManager.createProductB = function () {

    console.log('ProductB');

}

        

productManager.factory = function (typeType) {

    return new productManager[typeType];

}
productManager.factory("createProductA");

如果还不理解的话,那我们就再详细一点咯,假如我们想在网页面里插入一些元素,而这些元素类型不固定,可能是图片,也有可能是连接,甚至可能是文本,根据工厂模式的定义,我们需要定义工厂类和相应的子类,我们先来定义子类的具体实现(也就是子函数):

var page = page || {};

page.dom = page.dom || {};

//子函数1:处理文本

page.dom.Text = function () {

    this.insert = function (where) {

        var txt = document.createTextNode(this.url);

        where.appendChild(txt);

    };

};
//子函数2:处理链接

page.dom.Link = function () {

    this.insert = function (where) {

        var link = document.createElement('a');

        link.href = this.url;

        link.appendChild(document.createTextNode(this.url));

        where.appendChild(link);

    };

};
//子函数3:处理图片

page.dom.Image = function () {

    this.insert = function (where) {

        var im = document.createElement('img');

        im.src = this.url;

        where.appendChild(im);

    };

};

那么我们如何定义工厂处理函数呢?其实很简单:

page.dom.factory = function (type) {

    return new page.dom[type];

}

使用方式如下:
var o = page.dom.factory('Link');

o.url = 'http://www.cnblogs.com';

o.insert(document.body);

至此,工厂模式的介绍相信大家都已经了然于心了,我就不再多叙述了。

总结

什么时候使用工厂模式

以下几种情景下工厂模式特别有用:

1.对象的构建十分复杂
2.需要依赖具体环境创建不同实例
3.处理大量具有相同属性的小对象

什么时候不该用工厂模式

不滥用运用工厂模式,有时候仅仅只是给代码增加了不必要的复杂度,同时使得测试难以运行下去。

Javascript 相关文章推荐
JavaScript窗口功能指南之在窗口中书写内容
Jul 21 Javascript
javascript 动态生成私有变量访问器
Dec 06 Javascript
JQuery Tips(3) 关于$()包装集内元素的改变
Dec 14 Javascript
跟着Jquery API学Jquery之一 选择器
Apr 07 Javascript
基于jquery 的一个progressbar widge
Oct 29 Javascript
jtable列中自定义button示例代码
Nov 21 Javascript
JavaScript实现点击单元格改变背景色的方法
Feb 12 Javascript
详解vue.js下引入百度地图jsApi的两种方法
Jul 27 Javascript
node中的cookie的具体使用
Sep 13 Javascript
解决js相同的正则多次调用test()返回的值却不同的问题
Oct 10 Javascript
vue+element tabs选项卡分页效果
Jun 29 Javascript
Windows下安装 node 的版本控制工具 nvm
Feb 06 Javascript
JS运动基础框架实例分析
Mar 03 #Javascript
jQuery DOM插入节点操作指南
Mar 03 #Javascript
JS运动框架之分享侧边栏动画实例
Mar 03 #Javascript
jQuery DOM删除节点操作指南
Mar 03 #Javascript
JS实现表格数据各种搜索功能的方法
Mar 03 #Javascript
深入理解JavaScript系列(27):设计模式之建造者模式详解
Mar 03 #Javascript
javascript验证身份证号
Mar 03 #Javascript
You might like
Terran魔法科技
2020/03/14 星际争霸
自制短波长线天线频率预选器 - 成功消除B2K之流的镜像
2021/03/02 无线电
德劲1103二次变频版的打磨
2021/03/02 无线电
php合并数组array_merge函数运算符加号与的区别
2008/10/31 PHP
CI(Codeigniter)的Setting增强配置类实例
2016/01/06 PHP
Symfony2 session用法实例分析
2016/02/04 PHP
详解如何实现Laravel的服务容器的方法示例
2019/04/15 PHP
PHP正则表达式处理函数(PCRE 函数)实例小结
2019/05/09 PHP
PHP fopen中文文件名乱码问题解决方案
2020/10/28 PHP
javascript中运用闭包和自执行函数解决大量的全局变量问题
2010/12/30 Javascript
给jQuery方法添加回调函数一款插件的应用
2013/01/21 Javascript
javascript获取url上某个参数的方法
2013/11/08 Javascript
window.open()详解及浏览器兼容性问题示例探讨
2014/05/29 Javascript
jQuery中:input选择器用法实例
2015/01/03 Javascript
JQuery之proxy实现绑定代理方法
2016/08/01 Javascript
Nodejs实现文件上传的示例代码
2017/09/26 NodeJs
Vue源码探究之状态初始化
2018/11/14 Javascript
详解Puppeteer前端自动化测试实践
2019/02/21 Javascript
vue+element模态框中新增模态框和删除功能
2019/06/11 Javascript
微信小程序全局变量GLOBALDATA的定义和调用过程解析
2019/09/23 Javascript
javascript 关于赋值、浅拷贝、深拷贝的个人理解
2019/11/01 Javascript
Vue路由切换页面不更新问题解决方案
2020/07/10 Javascript
用Python的Django框架编写从Google Adsense中获得报表的应用
2015/04/17 Python
python输出指定月份日历的方法
2015/04/23 Python
python中while循环语句用法简单实例
2015/05/07 Python
使用python实现BLAST
2018/02/12 Python
Python 实现微信防撤回功能
2019/04/29 Python
使用Python实现文字转语音并生成wav文件的例子
2019/08/08 Python
CSS3,线性渐变(linear-gradient)的使用总结
2017/01/09 HTML / CSS
MAC彩妆澳洲官网:M·A·C AU
2021/01/17 全球购物
电子商务专业推荐信范文
2013/12/02 职场文书
尽职尽责村干部自我鉴定
2014/01/23 职场文书
幼儿园亲子活动方案
2014/01/29 职场文书
九一八事变演讲稿范文
2014/09/14 职场文书
2014年信访维稳工作总结
2014/12/08 职场文书
心得体会格式及范文
2016/01/25 职场文书