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比较和逻辑运算符的介绍
Mar 10 Javascript
JavaScript中使用stopPropagation函数停止事件传播例子
Aug 27 Javascript
JavaScript中的值类型转换介绍
Dec 31 Javascript
JavaScript中的Function函数
Aug 27 Javascript
JavaScript实现简单的tab选项卡切换
Jan 05 Javascript
jQuery实现的简单分页示例
Jun 01 Javascript
jQuery自适应轮播图插件Swiper用法示例
Aug 24 Javascript
jQuery动态生成表格及右键菜单功能示例
Jan 13 Javascript
angular2+node.js express打包部署的实战
Jul 27 Javascript
详解KOA2如何手写中间件(装饰器模式)
Oct 11 Javascript
vue.draggable实现表格拖拽排序效果
Dec 01 Javascript
通过实例解析vuejs如何实现调试代码
Jul 16 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
删除无限级目录与文件代码共享
2006/07/12 PHP
PHP中的多行字符串传递给JavaScript的两种方法
2014/06/19 PHP
Aster vs Newbee BO5 第二场2.19
2021/03/10 DOTA
javascript call和apply方法
2008/11/24 Javascript
判断对象是否Window的实现代码
2012/01/10 Javascript
js形成页面的一种遮罩效果实例代码
2014/01/04 Javascript
jQuery后代选择器用法实例
2014/12/23 Javascript
javascript中动态函数用法实例分析
2015/05/14 Javascript
JS实现屏蔽shift,Ctrl,alt等功能键的方法
2015/06/01 Javascript
详解JavaScript基于面向对象之创建对象(2)
2015/12/10 Javascript
Angular.js中定时器循环的3种方法总结
2017/04/27 Javascript
原生js jquery ajax请求以及jsonp的调用方法
2017/08/04 jQuery
解决vue 引入子组件报错的问题
2018/09/06 Javascript
es6基础学习之解构赋值
2018/12/10 Javascript
vue里的data要用return返回的原因浅析
2019/05/28 Javascript
详解Vue串联过滤器的使用场景
2020/04/30 Javascript
js代码编写无缝轮播图
2020/09/13 Javascript
[02:28]DOTA2英雄基础教程 狼人
2013/12/23 DOTA
[14:51]DOTA2 HEROS教学视频教你分分钟做大人-卓尔游侠
2014/06/13 DOTA
[00:32]2018DOTA2亚洲邀请赛Secret出场
2018/04/03 DOTA
学习python (2)
2006/10/31 Python
Python实现简单截取中文字符串的方法
2015/06/15 Python
浅述python中argsort()函数的实例用法
2017/03/30 Python
利用python如何处理nc数据详解
2018/05/23 Python
Python Pandas数据中对时间的操作
2019/07/30 Python
Python list运算操作代码实例解析
2020/01/20 Python
Python搭建Keras CNN模型破解网站验证码的实现
2020/04/07 Python
Python中bisect的用法及示例详解
2020/07/20 Python
python3让print输出不换行的方法
2020/08/24 Python
html5记忆翻牌游戏实现思路及代码
2013/07/25 HTML / CSS
html5唤起app的方法
2017/11/30 HTML / CSS
英国皇室御用百货:福南梅森(Fortnum & Mason)
2017/12/03 全球购物
学习十八大精神心得体会
2013/12/31 职场文书
员工薪酬福利制度
2014/01/17 职场文书
2015社区爱国卫生工作总结
2015/04/21 职场文书
2016中考冲刺决心书
2015/09/22 职场文书