JavaScript 模式之工厂模式(Factory)应用介绍


Posted in Javascript onNovember 15, 2012

工厂模式也是对象创建模式之一,它通常在类或类的静态方法中去实现。构造对象的一种方式是使用new操作符,但使用new时正是针对实现编程,会造成“耦合”问题,与具体的类关系紧密。导致代码更脆弱,缺乏弹性,在复杂逻辑的项目中建议是面向接口编程。
先看简单工厂模式

Person(name, age) { 
var obj = {} 
obj.name = name 
obj.age = age 
return obj 
} 
var p1 = Person('jack', 25) 
var p2 = Person('lily', 22)

与构造函数方式写一个类的区别在于没有使用this,而是每次都构造一个空对象,然后给其添加属性。创建对象方式不是使用new,而是使用函数调用方式。这种方式基本上用来替代一个类(具有相同属性的对象),而复杂一些的工厂则可以造不同类型的对象。
下面以个水果工厂示例
function Banana() { 
this.price = '$1.5' 
} 
function Apple() { 
this.price = '$1.2' 
} 
function Orange() { 
this.price = '$2.2' 
} 
// 静态工厂类 
function Fruit() {} 
Fruit.factory = function(type) { 
if (!window[type]) { 
return 
} 
var fruit = new window[type] 
return fruit 
} 
// 制造不同的水果 
var banana = Fruit.factory('Banana') 
var apple = Fruit.factory('Apple') 
var orange = Fruit.factory('Orange')

有三个水果类Banana、Apple、Orange,一个水果工厂类Fruit,通过静态方法factory每次可以造出不同的水果类对象。
工厂模式在JavaScript原生对象Object也有所体现,比如
var obj = Object(), 
num = Object(1), 
str = Object('s'), 
boo = Object(false);

Object就是一个工厂,根据参数不同会构造出不同的对象。obj是一个空对象,num是一个Number类型的对象,str是一个String类型的对象,boo是Boolean类型的对象。
jQuery.Callbacks也是一个工厂,每次调用它都会返回一个具有add, remove, fire等方法的对象。还可以根据参数如“once”, “memory”等构造出具有不同性质的对象。

所谓的工厂模式,是指可以返回一个对象的方法。
利用这种模式,我们可以做什么呢?假设我不满足现有的DOM对象里面所拥有的方法,我想要增加一个自定义的方法叫sayHello,我们可以这样做:

function RemouldNodeObj(DomNode){ 
//先判断一下传递进来的参数是不是一个Dom节点 
if(typeof DomNode == "object" && DomNode.nodeType == 1){ 
DomNode.say = function(){ 
alert("Hello!!"); 
} 
}else{ 
alert("你传递进来的参数不正确!"); 
} 
} //这样调用: 
window.onload = function(){ 
var oDiv = RemouldNodeObj(document.getElementById("test")); 
//通过这一步,oDiv就拥有了新的方法say 
oDiv.say(); 
}

有了上面的基础后,我们来实现点复杂的功能,我们要实现只要通过js的调用就生成一个简单的form表单,看代码:
<html> 
<head> 
<title>JavaScript之工厂模式</title> 
<script type="text/javascript"> 
function RemouldNodeObj(DOMnode){ 
//先判断一下传递进来的参数是不是一个Dom节点 
if(typeof DOMnode == "object" && DOMnode.nodeType == 1){ 
DOMnode.createForm = function(opt){ 
//下面是一大串的字符串加法,只是为了拼装出form元素 
var oForm = ""; 
oForm += "<form action=\"" + opt.action + "\" "; 
oForm += "method=\"" + (opt.method || 'GET') + "\" id=\""; 
oForm += (opt.id || "") + "\""; 
oForm += "style=\"width:200px;height:30px;border:2px solid #223344\">"; 
oForm += "</form>"; 
//这里的this不要想得太复杂,谁调用就指向谁,所以this指向 oDiv 
this.innerHTML = oForm; 
} 
}else{ 
alert("参数不正确!"); 
} 
return DOMnode; 
} //这样调用 
window.onload = function(){ 
var oDiv = RemouldNodeObj(document.getElementById("custom")); 
oDiv.createForm({ 
'action' : 'index.jsp', 
'method' : 'post', 
'id' : 'myForm' 
}); 
} 
</script> 
</head> 
<body> 
<div id="custom">###</div> 
</body> 
</html>

看到了没?这样的调用方式是不是很像jQuery?如果能够解决跨浏览器问题的话,其实完全可以做出一个搜索栏插件来!
Javascript 相关文章推荐
基于jquery的关于动态创建DOM元素的问题
Dec 24 Javascript
读jQuery之十一 添加事件核心方法
Jul 31 Javascript
JS操作JSON要领详细总结
Aug 25 Javascript
js页面跳转的常用方法整理
Oct 18 Javascript
Jquery使用val方法读写value值
May 18 Javascript
一篇文章掌握RequireJS常用知识
Jan 26 Javascript
Javascript中的Prototype到底是什么
Feb 16 Javascript
Bootstrap popover用法详解
Dec 22 Javascript
js 获取图像缩放后的实际宽高,位置等信息
Mar 07 Javascript
微信小程序多列选择器range-key使用详解
Mar 30 Javascript
详解react-native WebView 返回处理(非回调方法可解决)
Feb 27 Javascript
vue项目打包后请求地址错误/打包后跨域操作
Nov 04 Javascript
解决火狐浏览器下JS setTimeout函数不兼容失效不执行的方法
Nov 14 #Javascript
ko knockoutjs动态属性绑定技巧应用
Nov 14 #Javascript
Jquery颜色选择器ColorPicker实现代码
Nov 14 #Javascript
jquery offset函数应用实例
Nov 14 #Javascript
如何让div span等元素能响应键盘事件操作指南
Nov 13 #Javascript
给artDialog 5.02 增加ajax get功能详细介绍
Nov 13 #Javascript
jquery1.83 之前所有与异步列队相关的模块详细介绍
Nov 13 #Javascript
You might like
php+html5使用FormData对象提交表单及上传图片的方法
2015/02/11 PHP
PHP获取数组长度或某个值出现次数的方法
2015/02/11 PHP
PHP面试题之文件目录操作
2015/10/15 PHP
PHP如何将XML转成数组
2016/04/04 PHP
php curl简单采集图片生成base64编码(并附curl函数参数说明)
2019/02/15 PHP
input 输入框获得/失去焦点时隐藏/显示文字(jquery版)
2013/04/02 Javascript
jQuery实用基础超详细介绍
2013/04/11 Javascript
jquery实现智能感知连接外网搜索
2013/05/21 Javascript
减少访问DOM的次数提升javascript性能
2014/02/24 Javascript
js函数定时器实现定时读取系统实时连接数
2014/04/30 Javascript
Linux下编译安装php libevent扩展实例
2015/02/14 Javascript
JS设置cookie、读取cookie、删除cookie
2015/04/17 Javascript
贴近用户体验的Jquery日期、时间选择插件
2015/08/19 Javascript
基于jquery步骤进度条源码分享
2015/11/12 Javascript
基于bootstrap写的一点localStorage本地储存
2017/11/21 Javascript
解决vue处理axios post请求传参的问题
2018/03/05 Javascript
element-ui table span-method(行合并)的实现代码
2018/12/20 Javascript
vue cli3适配所有端方案的实现
2020/04/13 Javascript
vue实现div单选多选功能
2020/07/16 Javascript
[44:47]Ti4 循环赛第三日 iG vs NaVi
2014/07/12 DOTA
PYTHON压平嵌套列表的简单实现
2016/06/08 Python
Python实现字符串格式化的方法小结
2017/02/20 Python
python+selenium实现京东自动登录及秒杀功能
2017/11/18 Python
Django实现简单分页功能的方法详解
2017/12/05 Python
用Python将一个列表分割成小列表的实例讲解
2018/07/02 Python
python特性语法之遍历、公共方法、引用
2018/08/08 Python
UI自动化定位常用实现方法代码示例
2020/10/27 Python
Python 内存管理机制全面分析
2021/01/16 Python
意大利买卖二手奢侈品网站:LAMPOO
2020/06/03 全球购物
计算机专业推荐信范文
2013/11/27 职场文书
2014卖家双十一活动策划书
2014/09/29 职场文书
乡镇一岗双责责任书
2015/01/29 职场文书
发布会邀请函
2015/01/31 职场文书
2016学校先进集体事迹材料
2016/02/29 职场文书
MySQL pt-slave-restart工具的使用简介
2021/04/07 MySQL
Flask使用SQLAlchemy实现持久化数据
2021/07/16 Python