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 相关文章推荐
MC Dialog js弹出层 完美兼容多浏览器(5.6更新)
May 06 Javascript
js滑动提示效果代码分享
Mar 10 Javascript
js实现消息滚动效果
Jan 18 Javascript
BootStrap Table 后台数据绑定、特殊列处理、排序功能
May 27 Javascript
angularjs下拉框空白的解决办法
Jun 20 Javascript
iframe与主框架跨域相互访问实现方法
Sep 14 Javascript
利用nvm管理多个版本的node.js与npm详解
Nov 02 Javascript
bootstrap table表格插件之服务器端分页实例代码
Sep 12 Javascript
Vue项目中最新用到的一些实用小技巧
Nov 06 Javascript
vue项目刷新当前页面的三种方法
Dec 04 Javascript
JavaScript鼠标悬停事件用法解析
May 15 Javascript
antd的select下拉框因为数据量太大造成卡顿的解决方式
Oct 31 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
Cannot modify header information错误解决方法
2008/10/08 PHP
php cli 方式 在crotab中运行解决
2010/02/08 PHP
php表单转换textarea换行符的方法
2010/09/10 PHP
Javascript下IE与Firefox下的差异兼容写法总结
2010/06/18 Javascript
js里怎么取select标签里的值并修改
2012/12/10 Javascript
IE下JS读取xml文件示例代码
2013/08/05 Javascript
JS给超链接加确认对话框的方法
2015/02/24 Javascript
JavaScript中数据结构与算法(三):链表
2015/06/19 Javascript
详解jquery事件delegate()的使用方法
2016/01/25 Javascript
Bootstrap模仿起筷首页效果
2016/05/09 Javascript
jQuery右下角悬浮广告实例
2016/10/17 Javascript
详解如何在webpack中做预渲染降低首屏空白时间
2018/08/22 Javascript
使用Vue+Django+Ant Design做一个留言评论模块的示例代码
2020/06/01 Javascript
vue 路由缓存 路由嵌套 路由守卫 监听物理返回操作
2020/08/06 Javascript
OpenLayers3实现鼠标移动显示坐标
2020/09/25 Javascript
JavaScript/TypeScript 实现并发请求控制的示例代码
2021/01/18 Javascript
[01:17:47]TNC vs VGJ.S 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
python每次处理固定个数的字符的方法总结
2013/01/29 Python
跟老齐学Python之类的细节
2014/10/13 Python
Python批量重命名同一文件夹下文件的方法
2015/05/25 Python
Python爬虫之网页图片抓取的方法
2018/07/16 Python
python使用tkinter库实现五子棋游戏
2019/06/18 Python
详解python statistics模块及函数用法
2019/10/27 Python
python matplotlib拟合直线的实现
2019/11/19 Python
python爬虫开发之Request模块从安装到详细使用方法与实例全解
2020/03/09 Python
纯CSS和jQuery实现的在页面顶部显示的进度条效果2例(仿手机浏览器进度条效果)
2014/04/16 HTML / CSS
Lands’ End英国官方网站:高质量男女服装
2017/10/07 全球购物
ESDlife健康生活易:身体检查预订、搜寻及比较
2019/05/10 全球购物
飞利浦法国官网:Philips法国
2019/07/10 全球购物
2014大学校园光棍节活动策划书
2014/09/29 职场文书
爱情保证书
2015/01/17 职场文书
2015年中秋节活动总结
2015/03/23 职场文书
离婚代理词范文
2015/05/23 职场文书
MySQL事务操作的四大特性以及并发事务问题
2022/04/12 MySQL
vue实现input输入模糊查询的三种方式
2022/08/14 Vue.js
css之clearfix的用法深入理解(必看篇)
2023/05/21 HTML / CSS