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中cookie的添加、取值、删除示例代码
Oct 21 Javascript
JavaScript类继承及实例化的方法
Jul 25 Javascript
JavaScript在网页中画圆的函数arc使用方法
Nov 13 Javascript
20分钟打造属于你的Bootstrap站点
Jul 27 Javascript
JavaScript数组去重由慢到快由繁到简(优化篇)
Aug 26 Javascript
使用JS代码实现点击按钮下载文件
Nov 12 Javascript
Vue.js双向绑定操作技巧(初级入门)
Dec 27 Javascript
BootStrap表单控件之文本域textarea
May 23 Javascript
js实现关闭网页出现是否离开提示
Dec 07 Javascript
如何从零开始手写Koa2框架
Mar 22 Javascript
2020淘宝618理想生活列车自动领喵币js脚本的代码
Jun 02 Javascript
vue中的循环对象属性和属性值用法
Sep 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
初学者入门:细述PHP4的核心Zend
2006/09/05 PHP
实用函数3
2007/11/08 PHP
PHP中数组的分组排序实例
2014/06/01 PHP
PHP的关于变量和日期处理的一些面试题目整理
2015/08/10 PHP
php实现的错误处理封装类实例
2017/06/20 PHP
php打开本地exe程序,js打开本地exe应用程序,并传递相关参数方法
2018/02/06 PHP
php面向对象重点知识分享
2019/09/27 PHP
两种WEB下的模态对话框 (asp.net或js的分别实现)
2009/12/02 Javascript
使用jquery获取网页中图片高度的两种方法
2013/09/26 Javascript
你所不了解的javascript操作DOM的细节知识点(一)
2015/06/17 Javascript
Backbone.js的Hello World程序实例
2015/06/19 Javascript
JS 实现计算器详解及实例代码(一)
2017/01/08 Javascript
微信小程序简单实现form表单获取输入数据功能示例
2017/11/30 Javascript
微信小程序基于picker实现级联菜单
2019/02/15 Javascript
Vue.js中该如何自己维护路由跳转记录
2019/05/19 Javascript
JS实现随机抽选获奖者
2019/11/07 Javascript
JS+DIV实现拖动效果
2020/02/11 Javascript
[03:10]2014DOTA2 TI马来劲旅Titan首战告捷目标只是8强
2014/07/10 DOTA
Python获取Linux系统下的本机IP地址代码分享
2014/11/07 Python
python使用socket远程连接错误处理方法
2015/04/29 Python
Python图像处理之图像的缩放、旋转与翻转实现方法示例
2019/01/04 Python
解决python xx.py文件点击完之后一闪而过的问题
2019/06/24 Python
django基于cors解决跨域请求问题详解
2019/08/06 Python
django多文件上传,form提交,多对多外键保存的实例
2019/08/06 Python
python读取Kafka实例
2019/12/23 Python
打包PyQt5应用时的注意事项
2020/02/14 Python
安纳塔拉酒店度假村及水疗官方网站:Anantara Hotel
2016/08/25 全球购物
计算机专业推荐信范文
2013/11/20 职场文书
行政人事专员岗位职责
2014/03/05 职场文书
《大海那边》教学反思
2014/04/09 职场文书
保护环境倡议书
2014/04/14 职场文书
毕业生找工作求职信
2014/08/05 职场文书
机械设备与数控技术专业求职信
2014/08/10 职场文书
信息技术远程培训心得体会
2016/01/09 职场文书
go web 预防跨站脚本的实现方式
2021/06/11 Golang
【海涛dota解说】一房久违的影魔魂守二连发
2022/04/01 DOTA