深入理解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 RadioButtonList获取选中值
Apr 09 Javascript
Iframe 自动适应页面的高度示例代码
Feb 26 Javascript
JS实现新浪博客左侧的Blog管理菜单效果代码
Oct 22 Javascript
JS实现的3D拖拽翻页效果代码
Oct 31 Javascript
表单input项使用label同时引用Bootstrap库导致input点击效果区增大问题
Oct 11 Javascript
JS实现的点击表头排序功能示例
Mar 27 Javascript
AngularJS  ng-repeat遍历输出的用法
Jun 19 Javascript
Angular2+国际化方案(ngx-translate)的示例代码
Aug 23 Javascript
mui上拉加载更多下拉刷新数据的封装过程
Nov 03 Javascript
深入理解Vue官方文档梳理之全局API
Nov 22 Javascript
vue封装swiper代码实例解析
Oct 08 Javascript
ng-alain的sf如何自定义部件的流程
Jun 12 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 adodb连接mssql解决乱码问题
2009/06/12 PHP
php 深入理解strtotime函数的使用详解
2013/05/23 PHP
改写函数实现PHP二维/三维数组转字符串
2013/09/13 PHP
php获取淘宝分类id示例
2014/01/16 PHP
在 Laravel 项目中使用 webpack-encore的方法
2019/07/21 PHP
关于laravel后台模板laravel-admin select框的使用详解
2019/10/03 PHP
使用Jquery实现点击文字后变成文本框且可修改
2013/09/21 Javascript
jquery $.each 和for怎么跳出循环终止本次循环
2013/09/27 Javascript
javascript break指定标签打破多层循环示例
2014/01/20 Javascript
深入理解JavaScript系列(17):面向对象编程之概论详细介绍
2015/03/04 Javascript
JavaScript获取DOM元素的11种方法总结
2015/04/25 Javascript
javascript合并表格单元格实例代码
2016/01/03 Javascript
jQuery实现图像旋转动画效果
2016/05/29 Javascript
Javascript将双字节字符转换成单字节字符并计算长度
2016/06/22 Javascript
浅谈jQuery中的checkbox问题
2016/08/10 Javascript
jquery根据name取得select选中的值实例(超简单)
2018/01/25 jQuery
vue异步axios获取的数据渲染到页面的方法
2018/08/09 Javascript
Vue使用vue-recoure + http-proxy-middleware + vuex配合promise实现基本的跨域请求封装
2019/10/21 Javascript
vue watch监控对象的简单方法示例
2021/01/07 Vue.js
python判断输入日期为第几天的实例
2018/11/13 Python
详解有关PyCharm安装库失败的问题的解决方法
2020/02/02 Python
Python通过两个dataframe用for循环求笛卡尔积
2020/04/29 Python
深入了解NumPy 高级索引
2020/07/24 Python
俄罗斯建筑和装饰材料在线商店:Stroilandia
2020/07/25 全球购物
用JAVA实现一种排序,JAVA类实现序列化的方法(二种)
2014/04/23 面试题
室内设计自我鉴定
2013/10/15 职场文书
新闻学专业应届生求职信
2013/11/08 职场文书
汽车制造与装配专业自荐信范文
2014/01/02 职场文书
幼教毕业生自我鉴定
2014/01/12 职场文书
物理学专业自荐信
2014/06/11 职场文书
幼儿园六一活动总结
2014/08/27 职场文书
中学生2014国庆节演讲稿:不屈的民族
2014/09/21 职场文书
考研复习计划
2015/01/19 职场文书
教师师德工作总结2015
2015/07/22 职场文书
活动简报范文
2015/07/22 职场文书
gateway与spring-boot-starter-web冲突问题的解决
2021/07/16 Java/Android