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 window对象详解
Nov 12 Javascript
详解JavaScript的AngularJS框架中的作用域与数据绑定
Mar 04 Javascript
Backbone.js框架中Model与Collection的使用实例
May 07 Javascript
JS在浏览器中解析Base64编码图像
Feb 09 Javascript
vue实现简单loading进度条
Jun 06 Javascript
对angularJs中自定义指令replace的属性详解
Oct 09 Javascript
Vue实现移动端左右滑动效果的方法
Nov 27 Javascript
如何从0开始用node写一个自己的命令行程序
Dec 29 Javascript
JavaScript学习笔记之数组基本操作示例
Jan 09 Javascript
vue中格式化时间过滤器代码实例
Apr 17 Javascript
使用layui定义一个模块并使用的例子
Sep 14 Javascript
vue配置多代理服务接口地址操作
Sep 08 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
计算php页面运行时间的函数介绍
2013/07/01 PHP
PHP实现获取文件后缀名的几种常用方法
2015/08/08 PHP
WordPress中设置Post Type自定义文章类型的实例教程
2016/05/10 PHP
PHP图像识别技术原理与实现
2016/10/27 PHP
TP5框架实现的数据库备份功能示例
2020/04/05 PHP
jQuery实现设置、移除文本框默认值功能
2015/01/13 Javascript
JavaScript模块化开发之SeaJS
2015/12/13 Javascript
jquery遍历json对象集合详解
2016/05/18 Javascript
有关JS中的0,null,undefined,[],{},'''''''',false之间的关系
2017/02/14 Javascript
Angular+Node生成随机数的方法
2017/06/16 Javascript
js断点调试心得分享(必看篇)
2017/12/08 Javascript
vue-cli脚手架引入图片的几种方法总结
2018/03/13 Javascript
vue 组件高级用法实例详解
2018/04/11 Javascript
Layui Form 自定义验证的实例代码
2019/09/14 Javascript
详解Vue中的watch和computed
2020/11/09 Javascript
[00:36]DOTA2上海特级锦标赛 LGD战队宣传片
2016/03/04 DOTA
Python的消息队列包SnakeMQ使用初探
2016/06/29 Python
15行Python代码带你轻松理解令牌桶算法
2018/03/21 Python
python配置文件写入过程详解
2019/10/19 Python
基于Python 中函数的 收集参数 机制
2019/12/21 Python
Python跑循环时内存泄露的解决方法
2020/01/13 Python
20佳惊艳的HTML5应用程序示例分享
2011/05/03 HTML / CSS
美国儿童服装、家具和玩具精品店:Maisonette
2019/11/24 全球购物
在数据文件自动增长时,自动增长是否会阻塞对文件的更新
2014/05/01 面试题
Linux Interview Questions For software testers
2013/05/17 面试题
高级工程师英文求职信
2014/03/19 职场文书
导游个人求职信
2014/04/25 职场文书
巾帼志愿者活动方案
2014/08/17 职场文书
不服从上级领导安排的检讨书
2014/09/14 职场文书
高一学年自我鉴定范文(3篇)
2014/09/26 职场文书
自愿离婚协议书范文2014
2014/10/12 职场文书
干部作风建设心得体会
2014/10/22 职场文书
2014年社区个人工作总结
2014/12/02 职场文书
CSS3实现的侧滑菜单
2021/04/27 HTML / CSS
spring cloud gateway中如何读取请求参数
2021/07/15 Java/Android
关于JavaScript轮播图的实现
2021/11/20 Javascript