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 相关文章推荐
一段实现页面上的图片延时加载的js代码
Feb 11 Javascript
javascript动态添加表格数据行(ASP后台数据库保存例子)
May 08 Javascript
eval与window.eval的差别分析
Mar 17 Javascript
Raphael一个用于在网页中绘制矢量图形的Javascript库
Jan 08 Javascript
解析jQuery与其它js(Prototype)库兼容共存
Jul 04 Javascript
jquery取消选择select下拉框示例代码
Feb 22 Javascript
jquery简单的弹出层浮动层代码
Apr 27 Javascript
JavaScript 性能优化小结
Oct 12 Javascript
微信小程序 解析网页内容详解及实例
Feb 22 Javascript
简单实现JS上传图片预览功能
Apr 14 Javascript
小程序从手动埋点到自动埋点的实现方法
Jan 24 Javascript
vue draggable resizable gorkys与v-chart使用与总结
Sep 05 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
Linux下手动编译安装PHP扩展的例子分享
2014/07/15 PHP
PHP 微信扫码支付源代码(推荐)
2016/11/03 PHP
PHP序列化的四种实现方法与横向对比
2018/11/29 PHP
鼠标移动到一张图片时变为另一张图片
2006/12/05 Javascript
js自定义方法通过隐藏iframe实现文件下载
2013/02/21 Javascript
浅析用prototype定义自己的方法
2013/11/14 Javascript
JavaScript运行时库属性一览表
2014/03/14 Javascript
iframe调用父页面函数示例详解
2014/07/17 Javascript
JQuery对表单元素的基本操作使用总结
2014/07/18 Javascript
js实现ArrayList功能附实例代码
2014/10/29 Javascript
node.js中的console.assert方法使用说明
2014/12/10 Javascript
jQuery中clearQueue()方法用法实例
2014/12/29 Javascript
js实现接收表单的值并将值拼在表单action后面的方法
2015/11/23 Javascript
Node.js编写组件的三种实现方式
2016/02/25 Javascript
如何让一个json文件显示在表格里【实现代码】
2016/05/09 Javascript
Angular.js中处理页面闪烁的方法详解
2017/03/09 Javascript
JS判断两个对象内容是否相等的方法示例
2017/04/10 Javascript
angularjs实现简单的购物车功能
2017/09/21 Javascript
vue中简单弹框dialog的实现方法
2018/02/26 Javascript
JS/jQuery实现简单的开关灯效果【案例】
2019/02/19 jQuery
Vue 子组件与数据传递问题及注意事项
2019/07/11 Javascript
使用Python正则表达式操作文本数据的方法
2019/05/14 Python
Python检查 云备份进程是否正常运行代码实例
2019/08/22 Python
Python Django中的STATIC_URL 设置和使用方式
2020/03/27 Python
Python Opencv中用compareHist函数进行直方图比较对比图片
2020/04/07 Python
用于ETL的Python数据转换工具详解
2020/07/21 Python
python 生成正态分布数据,并绘图和解析
2020/12/21 Python
实例讲解CSS3中Transform的perspective属性的用法
2016/04/22 HTML / CSS
CSS3之2D与3D变换的实现方法
2019/01/28 HTML / CSS
美国独家设计师眼镜在线光学商店:Glasses Gallery
2017/12/28 全球购物
工程总经理工作职责
2013/12/09 职场文书
应用艺术专业个人的自我评价
2014/01/03 职场文书
早餐连锁店计划书
2014/01/08 职场文书
学生打架检讨书1000字
2014/01/16 职场文书
Python Pygame实战之塔防游戏的实现
2022/03/17 Python
redis调用二维码时的不断刷新排查分析
2022/04/01 Redis