深入理解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 DOM 学习总结(五)
Nov 24 Javascript
一个字符串中出现次数最多的字符 统计这个次数【实现代码】
Apr 29 Javascript
JavaScript学习小结之被嫌弃的eval函数和with语句实例详解
Aug 01 Javascript
jQuery插入节点和移动节点用法示例(insertAfter、insertBefore方法)
Sep 08 Javascript
jQuery插件HighCharts实现2D柱状图、折线图的组合多轴图效果示例【附demo源码下载】
Mar 09 Javascript
Vue配合iView实现省市二级联动的示例代码
Jul 27 Javascript
react 父子组件之间通讯props
Sep 08 Javascript
微信小程序tabbar底部导航
Nov 05 Javascript
JavaScript创建、读取和删除cookie
Sep 03 Javascript
js实现select下拉框选择
Jan 11 Javascript
详解node.js 事件循环
Jul 22 Javascript
js 将多个对象合并成一个对象 assign方法的实现
Sep 24 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
非洲第一个咖啡超凡杯大赛承办国—卢旺达的咖啡怎么样
2021/03/03 咖啡文化
php magic_quotes_gpc的一点认识与分析
2008/08/18 PHP
php+js实现图片的上传、裁剪、预览、提交示例
2013/08/27 PHP
php while循环得到循环次数
2013/10/26 PHP
php短址转换实现方法
2015/02/25 PHP
PHP中使用socket方式GET、POST数据实例
2015/04/02 PHP
php简单实现文件或图片强制下载的方法
2016/12/06 PHP
thinkPHP框架实现类似java过滤器的简单方法示例
2018/09/05 PHP
js几秒以后倒计时跳转示例
2013/12/26 Javascript
jquery中get和post的简单实例
2014/02/04 Javascript
js/jquery判断浏览器的方法小结
2014/09/02 Javascript
JS实现的4种数字千位符格式化方法分享
2015/03/02 Javascript
基于javascript制作经典传统的拼图游戏
2016/03/22 Javascript
10分钟掌握XML、JSON及其解析
2020/12/06 Javascript
jquery的父、子、兄弟节点查找,节点的子节点循环方法
2016/12/07 Javascript
vue页面切换到滚动页面显示顶部的实例
2018/03/13 Javascript
Vue2.X 通过AJAX动态更新数据
2018/07/17 Javascript
微信小程序websocket聊天室的实现示例代码
2019/02/12 Javascript
JavaScript 截取字符串代码实例
2019/09/05 Javascript
vue下axios拦截器token刷新机制的实例代码
2020/01/17 Javascript
python实现根据主机名字获得所有ip地址的方法
2015/06/28 Python
浅谈Python 中整型对象的存储问题
2016/05/16 Python
Python的时间模块datetime详解
2017/04/17 Python
requests和lxml实现爬虫的方法
2017/06/11 Python
python2.7 mayavi 安装图文教程(推荐)
2017/06/22 Python
分享给Python新手们的几道简单练习题
2017/09/21 Python
python3.6利用pyinstall打包py为exe的操作实例
2018/10/31 Python
Python操作MySQL数据库实例详解【安装、连接、增删改查等】
2020/01/17 Python
python实现全排列代码(回溯、深度优先搜索)
2020/02/26 Python
CSS3 创建网页动画实现弹跳球动效果
2018/10/30 HTML / CSS
html5+css3实现一款注册表单实例
2013/04/17 HTML / CSS
大学生的应聘自我评价
2013/12/13 职场文书
合作意向书
2014/07/30 职场文书
党支部对照检查材料
2014/08/25 职场文书
2014年会计主管工作总结
2014/12/20 职场文书
幼儿园教师师德表现自我评价
2015/03/05 职场文书