JavaScript 模式之工廠模式(Factory)應(yīng)用介紹
更新時(shí)間:2012年11月15日 14:15:13 作者:
工廠模式也是對(duì)象創(chuàng)建模式之一,它通常在類或類的靜態(tài)方法中去實(shí)現(xiàn),本文將詳細(xì)介紹JavaScript 工廠模式
工廠模式也是對(duì)象創(chuàng)建模式之一,它通常在類或類的靜態(tài)方法中去實(shí)現(xiàn)。構(gòu)造對(duì)象的一種方式是使用new操作符,但使用new時(shí)正是針對(duì)實(shí)現(xiàn)編程,會(huì)造成“耦合”問(wèn)題,與具體的類關(guān)系緊密。導(dǎo)致代碼更脆弱,缺乏彈性,在復(fù)雜邏輯的項(xiàng)目中建議是面向接口編程。
先看簡(jiǎn)單工廠模式
Person(name, age) {
var obj = {}
obj.name = name
obj.age = age
return obj
}
var p1 = Person('jack', 25)
var p2 = Person('lily', 22)
與構(gòu)造函數(shù)方式寫(xiě)一個(gè)類的區(qū)別在于沒(méi)有使用this,而是每次都構(gòu)造一個(gè)空對(duì)象,然后給其添加屬性。創(chuàng)建對(duì)象方式不是使用new,而是使用函數(shù)調(diào)用方式。這種方式基本上用來(lái)替代一個(gè)類(具有相同屬性的對(duì)象),而復(fù)雜一些的工廠則可以造不同類型的對(duì)象。
下面以個(gè)水果工廠示例
function Banana() {
this.price = '$1.5'
}
function Apple() {
this.price = '$1.2'
}
function Orange() {
this.price = '$2.2'
}
// 靜態(tài)工廠類
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')
有三個(gè)水果類Banana、Apple、Orange,一個(gè)水果工廠類Fruit,通過(guò)靜態(tài)方法factory每次可以造出不同的水果類對(duì)象。
工廠模式在JavaScript原生對(duì)象Object也有所體現(xiàn),比如
var obj = Object(),
num = Object(1),
str = Object('s'),
boo = Object(false);
Object就是一個(gè)工廠,根據(jù)參數(shù)不同會(huì)構(gòu)造出不同的對(duì)象。obj是一個(gè)空對(duì)象,num是一個(gè)Number類型的對(duì)象,str是一個(gè)String類型的對(duì)象,boo是Boolean類型的對(duì)象。
jQuery.Callbacks也是一個(gè)工廠,每次調(diào)用它都會(huì)返回一個(gè)具有add, remove, fire等方法的對(duì)象。還可以根據(jù)參數(shù)如“once”, “memory”等構(gòu)造出具有不同性質(zhì)的對(duì)象。
所謂的工廠模式,是指可以返回一個(gè)對(duì)象的方法。
利用這種模式,我們可以做什么呢?假設(shè)我不滿足現(xiàn)有的DOM對(duì)象里面所擁有的方法,我想要增加一個(gè)自定義的方法叫sayHello,我們可以這樣做:
function RemouldNodeObj(DomNode){
//先判斷一下傳遞進(jìn)來(lái)的參數(shù)是不是一個(gè)Dom節(jié)點(diǎn)
if(typeof DomNode == "object" && DomNode.nodeType == 1){
DomNode.say = function(){
alert("Hello!!");
}
}else{
alert("你傳遞進(jìn)來(lái)的參數(shù)不正確!");
}
}
//這樣調(diào)用:
window.onload = function(){
var oDiv = RemouldNodeObj(document.getElementById("test"));
//通過(guò)這一步,oDiv就擁有了新的方法say
oDiv.say();
}
有了上面的基礎(chǔ)后,我們來(lái)實(shí)現(xiàn)點(diǎn)復(fù)雜的功能,我們要實(shí)現(xiàn)只要通過(guò)js的調(diào)用就生成一個(gè)簡(jiǎn)單的form表單,看代碼:
<html>
<head>
<title>JavaScript之工廠模式</title>
<script type="text/javascript">
function RemouldNodeObj(DOMnode){
//先判斷一下傳遞進(jìn)來(lái)的參數(shù)是不是一個(gè)Dom節(jié)點(diǎn)
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不要想得太復(fù)雜,誰(shuí)調(diào)用就指向誰(shuí),所以this指向 oDiv
this.innerHTML = oForm;
}
}else{
alert("參數(shù)不正確!");
}
return DOMnode;
}
//這樣調(diào)用
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>
看到了沒(méi)?這樣的調(diào)用方式是不是很像jQuery?如果能夠解決跨瀏覽器問(wèn)題的話,其實(shí)完全可以做出一個(gè)搜索欄插件來(lái)!
先看簡(jiǎn)單工廠模式
復(fù)制代碼 代碼如下:
Person(name, age) {
var obj = {}
obj.name = name
obj.age = age
return obj
}
var p1 = Person('jack', 25)
var p2 = Person('lily', 22)
與構(gòu)造函數(shù)方式寫(xiě)一個(gè)類的區(qū)別在于沒(méi)有使用this,而是每次都構(gòu)造一個(gè)空對(duì)象,然后給其添加屬性。創(chuàng)建對(duì)象方式不是使用new,而是使用函數(shù)調(diào)用方式。這種方式基本上用來(lái)替代一個(gè)類(具有相同屬性的對(duì)象),而復(fù)雜一些的工廠則可以造不同類型的對(duì)象。
下面以個(gè)水果工廠示例
復(fù)制代碼 代碼如下:
function Banana() {
this.price = '$1.5'
}
function Apple() {
this.price = '$1.2'
}
function Orange() {
this.price = '$2.2'
}
// 靜態(tài)工廠類
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')
有三個(gè)水果類Banana、Apple、Orange,一個(gè)水果工廠類Fruit,通過(guò)靜態(tài)方法factory每次可以造出不同的水果類對(duì)象。
工廠模式在JavaScript原生對(duì)象Object也有所體現(xiàn),比如
復(fù)制代碼 代碼如下:
var obj = Object(),
num = Object(1),
str = Object('s'),
boo = Object(false);
Object就是一個(gè)工廠,根據(jù)參數(shù)不同會(huì)構(gòu)造出不同的對(duì)象。obj是一個(gè)空對(duì)象,num是一個(gè)Number類型的對(duì)象,str是一個(gè)String類型的對(duì)象,boo是Boolean類型的對(duì)象。
jQuery.Callbacks也是一個(gè)工廠,每次調(diào)用它都會(huì)返回一個(gè)具有add, remove, fire等方法的對(duì)象。還可以根據(jù)參數(shù)如“once”, “memory”等構(gòu)造出具有不同性質(zhì)的對(duì)象。
所謂的工廠模式,是指可以返回一個(gè)對(duì)象的方法。
利用這種模式,我們可以做什么呢?假設(shè)我不滿足現(xiàn)有的DOM對(duì)象里面所擁有的方法,我想要增加一個(gè)自定義的方法叫sayHello,我們可以這樣做:
復(fù)制代碼 代碼如下:
function RemouldNodeObj(DomNode){
//先判斷一下傳遞進(jìn)來(lái)的參數(shù)是不是一個(gè)Dom節(jié)點(diǎn)
if(typeof DomNode == "object" && DomNode.nodeType == 1){
DomNode.say = function(){
alert("Hello!!");
}
}else{
alert("你傳遞進(jìn)來(lái)的參數(shù)不正確!");
}
}
//這樣調(diào)用:
window.onload = function(){
var oDiv = RemouldNodeObj(document.getElementById("test"));
//通過(guò)這一步,oDiv就擁有了新的方法say
oDiv.say();
}
有了上面的基礎(chǔ)后,我們來(lái)實(shí)現(xiàn)點(diǎn)復(fù)雜的功能,我們要實(shí)現(xiàn)只要通過(guò)js的調(diào)用就生成一個(gè)簡(jiǎn)單的form表單,看代碼:
復(fù)制代碼 代碼如下:
<html>
<head>
<title>JavaScript之工廠模式</title>
<script type="text/javascript">
function RemouldNodeObj(DOMnode){
//先判斷一下傳遞進(jìn)來(lái)的參數(shù)是不是一個(gè)Dom節(jié)點(diǎn)
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不要想得太復(fù)雜,誰(shuí)調(diào)用就指向誰(shuí),所以this指向 oDiv
this.innerHTML = oForm;
}
}else{
alert("參數(shù)不正確!");
}
return DOMnode;
}
//這樣調(diào)用
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>
看到了沒(méi)?這樣的調(diào)用方式是不是很像jQuery?如果能夠解決跨瀏覽器問(wèn)題的話,其實(shí)完全可以做出一個(gè)搜索欄插件來(lái)!
您可能感興趣的文章:
- JavaScript設(shè)計(jì)模式--簡(jiǎn)單工廠模式定義與應(yīng)用案例詳解
- javascript設(shè)計(jì)模式 – 簡(jiǎn)單工廠模式原理與應(yīng)用實(shí)例分析
- Javascript設(shè)計(jì)模式理論與編程實(shí)戰(zhàn)之簡(jiǎn)單工廠模式
- JS面向?qū)ο蠡A(chǔ)講解(工廠模式、構(gòu)造函數(shù)模式、原型模式、混合模式、動(dòng)態(tài)原型模式)
- js面向?qū)ο笾R?jiàn)創(chuàng)建對(duì)象的幾種方式(工廠模式、構(gòu)造函數(shù)模式、原型模式)
- javascript 模式設(shè)計(jì)之工廠模式學(xué)習(xí)心得
- JavaScript創(chuàng)建對(duì)象方式總結(jié)【工廠模式、構(gòu)造函數(shù)模式、原型模式等】
- JavaScript設(shè)計(jì)模式之觀察者模式(發(fā)布者-訂閱者模式)
- 常用的Javascript設(shè)計(jì)模式小結(jié)
- 常用的javascript設(shè)計(jì)模式
- JavaScript設(shè)計(jì)模式--簡(jiǎn)單工廠模式實(shí)例分析【XHR工廠案例】
相關(guān)文章
js實(shí)現(xiàn)一個(gè)猜數(shù)字游戲
本文主要介紹了js實(shí)現(xiàn)一個(gè)猜數(shù)字游戲的實(shí)例代碼。具有很好的參考價(jià)值,下面跟著小編一起來(lái)看下吧2017-03-03
原生JavaScript實(shí)現(xiàn)購(gòu)物車效果
這篇文章主要為大家詳細(xì)介紹了原生JavaScript實(shí)現(xiàn)購(gòu)物車效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-07-07
JavaScript中對(duì)象property的刪除方法介紹
這篇文章主要介紹了JavaScript中對(duì)象property的刪除方法介紹,本文主要是對(duì)delete操作符的介紹,需要的朋友可以參考下2014-12-12
JS返回上一頁(yè)實(shí)例代碼通過(guò)圖片和按鈕分別實(shí)現(xiàn)
返回上一頁(yè)的方法有很多,本代碼通過(guò)圖片和按鈕分別實(shí)現(xiàn),感興趣的朋友可以參考下,希望對(duì)大家有所幫助2013-08-08
超越Jquery_01_isPlainObject分析與重構(gòu)
isPlainObject是Jquery1.4后提供的新方法,用于判斷對(duì)象是否是純粹的對(duì)象(通過(guò) {} 或者 new Object 創(chuàng)建的)。2010-10-10
如何通過(guò)js實(shí)現(xiàn)圖片預(yù)覽功能【附實(shí)例代碼】
如何通過(guò)js實(shí)現(xiàn)圖片預(yù)覽功能呢?下面小編就為大家?guī)?lái)一篇用js實(shí)現(xiàn)圖片預(yù)覽功能。給大家做個(gè)參考吧,一起跟隨小編過(guò)來(lái)看看2016-03-03

