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 相关文章推荐
jquery中对表单的基本操作代码
Jul 29 Javascript
JavaScript之引用类型介绍
Aug 10 Javascript
JS控件的生命周期介绍
Oct 22 Javascript
Jquery实现的简单轮播效果【附实例】
Apr 19 Javascript
vue.js父组件使用外部对象的方法示例
Apr 25 Javascript
AngularJs定时器$interval 和 $timeout详解
May 25 Javascript
实例详解JavaScript中setTimeout函数的执行顺序
Jul 12 Javascript
JavaScript利用fetch实现异步请求的方法实例
Jul 26 Javascript
Vue 页面切换效果之 BubbleTransition(推荐)
Apr 08 Javascript
通过实例讲解JS如何防抖动
Jun 15 Javascript
解决Layui当中的导航条动态添加后渲染失败的问题
Sep 25 Javascript
Vue $emit()不能触发父组件方法的原因及解决
Jul 28 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
调频问题解答
2021/03/01 无线电
全面解析PHP操作Memcache基本函数
2016/07/14 PHP
用JAVASCRIPT如何给&amp;lt;textarea&amp;gt;&amp;lt;/textarea&amp;gt;赋值
2007/04/20 Javascript
ExtJS 下拉多选框lovcombo
2010/05/19 Javascript
js中将HTMLCollection/NodeList/伪数组转换成数组的代码
2011/07/31 Javascript
JavaScript高级程序设计 客户端存储学习笔记
2011/09/10 Javascript
js实现简单的可切换选项卡效果
2015/04/10 Javascript
JavaScript如何调试有哪些建议和技巧附五款有用的调试工具
2015/10/28 Javascript
用jQuery获取table中行id和td值的实现代码
2016/05/19 Javascript
使用JavaScript判断手机浏览器是横屏还是竖屏问题
2016/08/02 Javascript
基于vue-ssr的静态网站生成器VuePress 初体验
2018/04/17 Javascript
layui select获取自定义属性方法
2018/08/15 Javascript
vue新vue-cli3环境配置和模拟json数据的实例
2018/09/19 Javascript
JS原生带缩略图的图片切换效果
2018/10/10 Javascript
jQuery实现动态添加和删除input框实例代码
2019/03/26 jQuery
vue.js实现图书管理功能
2019/09/24 Javascript
使用layui的layer组件做弹出层的例子
2019/09/27 Javascript
layui+jquery支持IE8的表格分页方法
2019/09/28 jQuery
Vue Router的手写实现方法实现
2020/03/02 Javascript
Python中使用异常处理来判断运行的操作系统平台方法
2015/01/22 Python
python读取json文件并将数据插入到mongodb的方法
2015/03/23 Python
python语言使用技巧分享
2016/05/31 Python
Python 详解基本语法_函数_返回值
2017/01/22 Python
Python反射用法实例简析
2017/12/22 Python
python的xpath获取div标签内html内容,实现innerhtml功能的方法
2019/01/02 Python
python区块及区块链的开发详解
2019/07/03 Python
美国珠宝网上商店:Jeulia
2016/09/01 全球购物
美国最大的船只买卖在线市场:Boat Trader
2018/08/04 全球购物
编辑个人求职信范文
2013/09/21 职场文书
小学数学教学反思
2014/02/02 职场文书
2014年个人年终总结
2015/03/09 职场文书
自我推荐信格式模板
2015/03/24 职场文书
入党积极分子半年考察意见
2015/06/02 职场文书
郭明义电影观后感
2015/06/08 职场文书
2016年学生会感恩节活动总结
2016/04/01 职场文书
python中if和elif的区别介绍
2021/11/07 Python