深入理解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 相关文章推荐
jquery显示和隐藏div特效实例
Feb 27 Javascript
JQuery中form验证出错信息的查看方法
Oct 08 Javascript
js触发select onchange事件的小技巧
Aug 05 Javascript
jQuery表格插件datatables用法总结
Sep 05 Javascript
jQuery实现ToolTip元素定位显示功能示例
Nov 23 Javascript
jQuery Ajax全解析
Feb 13 Javascript
addeventlistener监听scroll跟touch(实例讲解)
Aug 04 Javascript
react学习笔记之state以及setState的使用
Dec 07 Javascript
vue--vuex详解
Apr 15 Javascript
Vue 列表上下过渡效果的实例代码
Jun 25 Javascript
javascript设计模式 ? 装饰模式原理与应用实例分析
Apr 14 Javascript
Vue scoped及deep使用方法解析
Aug 01 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
php二维数组排序详解
2013/11/06 PHP
老生常谈ThinkPHP中的行为扩展和插件(推荐)
2017/05/05 PHP
使用Laravel中的查询构造器实现增删改查功能
2019/09/03 PHP
Laravel 将数据表的数据导出,并生成seeds种子文件的方法
2019/10/09 PHP
PHP实现常用排序算法的方法
2020/02/05 PHP
在jQuery中 关于json空对象筛选替换
2013/04/15 Javascript
jquery 实现密码框的显示与隐藏示例代码
2013/09/18 Javascript
jquery将一个表单序列化为一个对象的方法
2013/12/02 Javascript
JS执行删除前的判断代码
2014/02/18 Javascript
再探JavaScript作用域
2014/09/24 Javascript
javascript实现当前页导航激活的方法
2015/02/27 Javascript
JS获取iframe中longdesc属性的方法
2015/04/01 Javascript
WEB前端开发都应知道的jquery小技巧及jquery三个简写
2015/11/15 Javascript
50 个 jQuery 插件可将你的网站带到另外一个高度
2016/04/26 Javascript
浅析jquery unbind()方法移除元素绑定的事件
2016/05/24 Javascript
Bootstrap实现导航栏的2种方式
2016/11/28 Javascript
BootStrap整体框架之基础布局组件
2016/12/15 Javascript
Easyui使用Dialog行内按钮布局的实例
2017/07/27 Javascript
浅谈Express异步进化史
2017/09/09 Javascript
javaScript手机号码校验工具类PhoneUtils详解
2017/12/08 Javascript
Python中MySQLdb和torndb模块对MySQL的断连问题处理
2015/11/09 Python
使用Python & Flask 实现RESTful Web API的实例
2017/09/19 Python
使用tensorflow实现线性svm
2018/09/07 Python
Python3.5模块的定义、导入、优化操作图文详解
2019/04/27 Python
python2爬取百度贴吧指定关键字和图片代码实例
2019/08/14 Python
python模拟键盘输入 切换键盘布局过程解析
2019/08/15 Python
python并发编程多进程之守护进程原理解析
2019/08/20 Python
WebSphere 应用服务器都支持哪些认证
2013/12/26 面试题
几个常见的消息中间件(MOM)
2014/01/08 面试题
应用化学专业职业生涯规划书
2013/12/31 职场文书
优秀经理获奖感言
2014/03/04 职场文书
募捐倡议书怎么写
2014/05/14 职场文书
公司合并协议书范本
2014/09/30 职场文书
2014普法依法治理工作总结
2014/12/18 职场文书
2015年党员个人自我评价
2015/03/03 职场文书
python获取淘宝服务器时间的代码示例
2021/04/22 Python