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 相关文章推荐
javascript编写实用的省市选择器
Feb 12 Javascript
浅谈jQuery.easyui的datebox格式化时间
Jun 25 Javascript
举例讲解JavaScript中关于对象操作的相关知识
Nov 16 Javascript
JavaScript中Textarea滚动条不能拖动的解决方法
Dec 15 Javascript
jquery插件uploadify多图上传功能实现代码
Aug 12 Javascript
AngularJS  ng-table插件设置排序
Sep 21 Javascript
jQuery使用ajax方法解析返回的json数据功能示例
Jan 10 Javascript
vue 挂载路由到头部导航的方法
Nov 13 Javascript
微信小程序自定义对话框弹出和隐藏动画
Jul 19 Javascript
JS实现的A*寻路算法详解
Dec 14 Javascript
JavaScript面向对象编程小游戏---贪吃蛇代码实例
May 15 Javascript
vue用elementui写form表单时,在label里添加空格操作
Aug 13 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
PHPlet在Windows下的安装
2006/10/09 PHP
PHP Google的translate API代码
2008/12/10 PHP
IIS6+PHP5+MySQL5+Zend Optimizer+phpMyAdmin安装配置图文教程 2009年
2009/06/08 PHP
thinkphp 一个页面使用2次分页的实现方法
2013/07/15 PHP
PHP中遇到BOM、编码导致json_decode函数无法解析问题
2014/07/02 PHP
PHP实现微信对账单处理
2018/10/01 PHP
Laravel5.1 框架控制器基础用法实例分析
2020/01/04 PHP
潜说js对象和数组
2011/05/25 Javascript
JS无法捕获滚动条上的mouse up事件的原因猜想
2012/03/21 Javascript
基于jquery实现的一个选择中国大学的弹框 (数据、步骤、代码)
2012/07/26 Javascript
javascipt基础内容--需要注意的细节
2013/04/10 Javascript
深入分析jsonp协议原理
2015/09/26 Javascript
深入剖析JavaScript中的函数currying柯里化
2016/04/29 Javascript
分享JS代码实现鼠标放在输入框上输入框和图片同时更换样式
2016/09/01 Javascript
jQuery过滤选择器用法示例
2016/09/12 Javascript
Bootstrap源码解读排版(1)
2016/12/23 Javascript
浅谈Vue使用Elementui修改默认的最快方法
2020/12/05 Vue.js
Python实现八大排序算法
2016/08/13 Python
详谈python在windows中的文件路径问题
2018/04/28 Python
Python实现矩阵相乘的三种方法小结
2018/07/26 Python
Python操作远程服务器 paramiko模块详细介绍
2019/08/07 Python
python中struct模块之字节型数据的处理方法
2019/08/27 Python
opencv调整图像亮度对比度的示例代码
2019/09/27 Python
python实现批量修改文件名
2020/03/23 Python
送给他或她的礼物:FUN.com
2018/08/17 全球购物
Superdry极度干燥美国官网:英国制造的服装品牌
2018/11/13 全球购物
简短证婚人证婚词
2014/01/09 职场文书
十佳护士先进事迹
2014/05/08 职场文书
电子商务系毕业生自荐信
2014/05/29 职场文书
银行求职自荐书
2014/06/25 职场文书
四查四看整改措施
2014/09/19 职场文书
干部作风整顿个人剖析材料
2014/10/06 职场文书
乡村教师党员四风问题对照检查材料思想汇报
2014/10/08 职场文书
初三学生语文考试作弊检讨书
2014/12/14 职场文书
2015年迎新晚会策划书
2015/07/16 职场文书
端午节将至,用Python爬取粽子数据并可视化,看看网友喜欢哪种粽子吧!
2021/06/11 Python