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 easyui滚动条部分设置介绍
Sep 12 Javascript
javascript处理表单示例(javascript提交表单)
Apr 28 Javascript
node.js中的querystring.escape方法使用说明
Dec 10 Javascript
setinterval()与clearInterval()JS函数的调用方法
Jan 21 Javascript
js时间戳转为日期格式的方法
Dec 28 Javascript
谈一谈javascript闭包
Jan 28 Javascript
JS刷新父窗口的几种方式小结(推荐)
Nov 09 Javascript
jQuery表单验证之密码确认
May 22 jQuery
又拍云 Node.js 实现文件上传、删除功能
Oct 28 Javascript
小程序获取周围IBeacon设备的方法
Oct 31 Javascript
JS实现马赛克图片效果完整示例
Apr 13 Javascript
JavaScript的Proxy可以做哪些有意思的事儿
Jun 15 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实现QQ登录实例代码
2016/01/14 PHP
php 输出json及显示json中的中文汉字详解及实例
2016/11/09 PHP
PHP利用缓存处理用户注册时的邮箱验证,成功后用户数据存入数据库操作示例
2019/12/31 PHP
jQuery Tools tooltip使用说明
2012/07/14 Javascript
JavaScript中的类数组对象介绍
2014/12/30 Javascript
使用jquery插件qrcode生成二维码
2015/10/22 Javascript
JS点击某个图标或按钮弹出文件选择框的实现代码
2016/09/27 Javascript
微信小程序 video详解及简单实例
2017/01/16 Javascript
bootstrapvalidator之API学习教程
2017/06/29 Javascript
javascript中的replace函数(带注释demo)
2018/01/07 Javascript
React从react-router路由上做登陆验证控制的方法
2018/05/10 Javascript
vue 之 css module的使用方法
2018/12/04 Javascript
nodejs中各种加密算法的实现详解
2019/07/11 NodeJs
如何在postman中添加cookie信息步骤解析
2020/06/30 Javascript
[55:04]海涛DOTA2死魂复燃6.82版本介绍
2014/09/28 DOTA
Python的网络编程库Gevent的安装及使用技巧
2016/06/24 Python
Python列表list内建函数用法实例分析【insert、remove、index、pop等】
2017/07/24 Python
Python中的TCP socket写法示例
2018/05/11 Python
Python Flask框架扩展操作示例
2019/05/03 Python
python中如何实现将数据分成训练集与测试集的方法
2019/09/13 Python
python实现小世界网络生成
2019/11/21 Python
python判断字符串以什么结尾的实例方法
2020/09/18 Python
世界上最大的汽车共享网站:Zipcar
2017/01/14 全球购物
GafasWorld哥伦比亚:网上购买眼镜
2017/11/28 全球购物
乡下人家教学反思
2014/02/01 职场文书
模具设计与制造专业推荐信
2014/02/16 职场文书
经济信息系毕业生自荐信范文
2014/03/15 职场文书
协议书的格式
2014/04/23 职场文书
共产党员公开承诺践诺书
2014/05/28 职场文书
本科生求职信
2014/06/17 职场文书
2015迎新晚会活动总结
2015/07/16 职场文书
婚礼长辈答谢词
2015/09/29 职场文书
python实现网络五子棋
2021/04/11 Python
mysql函数全面总结
2021/11/11 MySQL
试用1103暨1103、1101同门大比武 [ DAIWEI ]
2022/04/05 无线电
Java实现简单小画板
2022/06/10 Java/Android