深入理解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 相关文章推荐
JS的递增/递减运算符和带操作的赋值运算符的等价式
Dec 08 Javascript
探讨:JavaScript ECAMScript5 新特性之get/set访问器
May 05 Javascript
jquery实现折叠菜单效果【推荐】
Mar 08 Javascript
react-native之ART绘图方法详解
Aug 08 Javascript
Angular事件之不同组件间传递数据的方法
Nov 15 Javascript
vue实现双向绑定和依赖收集遇到的坑
Nov 29 Javascript
js中null与空字符串""的区别讲解
Jan 17 Javascript
Vue.use()在new Vue() 之前使用的原因浅析
Aug 26 Javascript
js实现抽奖的两种方法
Mar 19 Javascript
javascript用defineProperty实现简单的双向绑定方法
Apr 03 Javascript
微信小程序开发(一):服务器获取数据列表渲染操作示例
Jun 01 Javascript
ES5和ES6中类的区别总结
Dec 21 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
zf框架的db类select查询器join链表使用示例(zend框架)
2014/03/14 PHP
jQuery+PHP+ajax实现微博加载更多内容列表功能
2014/06/27 PHP
Javascript拓展String方法小结
2013/07/08 Javascript
js获取浏览器基本信息大全
2014/11/27 Javascript
node.js中的querystring.stringify方法使用说明
2014/12/10 Javascript
简单实现js选项卡切换效果
2016/02/03 Javascript
javascript HTML+CSS实现经典橙色导航菜单
2016/02/16 Javascript
Angularjs分页查询的实现
2017/02/24 Javascript
angular4实现tab栏切换的方法示例
2017/10/21 Javascript
微信小程序如何获取用户手机号
2018/01/26 Javascript
Element-UI中Upload上传文件前端缓存处理示例
2019/02/21 Javascript
详解单页面路由工程使用微信分享及二次分享解决方案
2019/02/22 Javascript
微信小程序去除左上角返回键的实现方法
2020/03/06 Javascript
JS中的继承操作实例总结
2020/06/06 Javascript
详解Vue Cli浏览器兼容性实践
2020/06/08 Javascript
vue组件入门知识全梳理
2020/09/21 Javascript
[01:23:45]DOTA2-DPC中国联赛 正赛 CDEC vs Dragon BO3 第一场 1月22日
2021/03/11 DOTA
python实现的简单抽奖系统实例
2015/05/22 Python
python 默认参数问题的陷阱
2016/02/29 Python
Python简单生成8位随机密码的方法
2017/05/24 Python
详解python实现识别手写MNIST数字集的程序
2018/08/03 Python
浅析Python 读取图像文件的性能对比
2019/03/07 Python
Python实现的对一个数进行因式分解操作示例
2019/06/27 Python
python ftplib模块使用代码实例
2019/12/31 Python
在pycharm中实现删除bookmark
2020/02/14 Python
Python 使用 environs 库定义环境变量的方法
2020/02/25 Python
Python random库使用方法及异常处理方案
2020/03/02 Python
如何快速理解python的垃圾回收机制
2020/09/01 Python
Python爬虫新手入门之初学lxml库
2020/12/20 Python
8和9的加减法教学反思
2014/05/01 职场文书
最美乡村医生事迹材料
2014/06/02 职场文书
因个人原因离职的辞职信范文
2015/05/12 职场文书
2015年煤矿安全工作总结
2015/05/23 职场文书
工程款催款函
2015/06/24 职场文书
两行代码解决Jupyter Notebook中文不能显示的问题
2021/04/24 Python
详解Oracle块修改跟踪功能
2021/11/07 Oracle