javascript設(shè)計模式 – 簡單工廠模式原理與應(yīng)用實例分析
本文實例講述了javascript設(shè)計模式 – 簡單工廠模式。分享給大家供大家參考,具體如下:
介紹:簡單工廠模式是最常用的一類創(chuàng)建型設(shè)計模式。其中簡單工廠模式并不屬于GoF23個經(jīng)典設(shè)計模式,它通常被作為學(xué)習(xí)其他工廠模式的基礎(chǔ)。
定義:定義一個工廠類,它可以根據(jù)參數(shù)的不同返回不同的實例,被創(chuàng)建的實例通常都具有相同的父類,因為在簡單工廠模式中創(chuàng)建實例的方法是靜態(tài)方法,因此簡單工廠模式又被稱為靜態(tài)工廠方法模式,它屬于類創(chuàng)建型模式。
場景:我們需要寫一個dialog工具類,在項目初期我們只需要考慮一個簡單的彈窗實現(xiàn),項目持續(xù)迭代,會衍生出各種類型的彈窗,帶關(guān)閉按鈕的,帶確認(rèn)按鈕的…..
我見到最多的做法是根據(jù)一個type值來判斷當(dāng)前需要彈什么類型的窗口,這樣的設(shè)計我之前沒覺得有問題,但是看了前面介紹的設(shè)計原則,我們也來分析下這么做的缺點:
1. 存在多個if…else…代碼塊,代碼冗長,閱讀困難,維護(hù)困難,測試?yán)щy,影響系統(tǒng)性能。
2. dialog類職責(zé)過重,負(fù)責(zé)初始化所有彈窗實例,違反了單一職責(zé)原則,不利于重用和維護(hù)。
3. 當(dāng)需要新增彈窗類型是,必須修改源代碼,違反了開關(guān)原則。
4. 不同種類彈窗基礎(chǔ)樣式相同,會導(dǎo)致存在大量重復(fù)代碼。
5. 各類彈窗的創(chuàng)建和使用都是在各個業(yè)務(wù)邏輯中,如果我想修改創(chuàng)建方式必須修改所有業(yè)務(wù)代碼,違反了開關(guān)原則
示例:
var Dialog = (function(){
var createNotice = function(){
return '<div>notice</div>';
}
var createToast = function(){
return '<div>toast</div>';
}
var createWarnin = function(){
return '<div>warnin</div>';
}
var Dialog = function(){
this.element = '';
this.name = '';
this.show = function(){
console.log(this.name + ' is show -> ' + this.element);
};
}
return {
factory: function(arg){
var _dialog;
if(arg === 'notice'){
_dialog = new Dialog();
_dialog.element = createNotice();
_dialog.name = 'notice';
}else if(arg === 'toast'){
_dialog = new Dialog();
_dialog.element = createToast();
_dialog.name = 'toast';
}else if(arg === 'warnin'){
_dialog = new Dialog();
_dialog.element = createWarnin();
_dialog.name = 'warnin';
}
return _dialog;
}
}
})();
var notice = Dialog.factory('notice');
var toast = Dialog.factory('toast');
var warnin = Dialog.factory('warnin');
toast.show(); //toast is show -> <div>toast</div>
notice.show(); //notice is show -> <div>notice</div>
warnin.show(); //warnin is show -> <div>warnin</div>
以上的解決方案是自己理解著寫的,對照著java的示例寫了一個,實現(xiàn)的方式有很多種,你可以用原型鏈,用繼承來實現(xiàn)都可以。我們這里主要討論下為什么要這么寫。
之前我們列出了5個缺點:我們主要解決了2,4和5,將共有的方法屬性抽取出來寫在父類上,減少了重復(fù)代碼,將每種情況特有的代碼抽取出來,解決了不符合單一職責(zé)原則的問題。
重要的是將所有彈窗的創(chuàng)建集中在工廠類中,當(dāng)有修改時,只需要修改工廠類即可,不會影響業(yè)務(wù)代碼。
這里我們思考一下:1.如何去掉那些if…else…? 2.當(dāng)我要新增一個error類型的彈窗時如何滿足開關(guān)原則?
我自己試了一下:
var Dialog = function(){
this.element = '';
this.name = '';
this.show = function(){
console.log(this.name + ' is show -> ' + this.element);
};
}
Dialog.createNotice = function(){ return '<div>notice</div>'; };
Dialog.createToast = function(){ return '<div>toast</div>'; };
Dialog.createWarnin = function(){ return '<div>warnin</div>'; };
Dialog.factory = function(arg){
var _dialog = new Dialog();
_dialog.element = Dialog[arg]();
_dialog.name = arg;
return _dialog;
};
var notice = Dialog.factory('createNotice');
var toast = Dialog.factory('createToast');
var warnin = Dialog.factory('createWarnin');
notice.show(); //createNotice is show -> <div>notice</div>
warnin.show(); //createWarnin is show -> <div>warnin</div>
toast.show(); //createToast is show -> <div>toast</div>
這樣當(dāng)我做新增時,只需要要新增一條配置即可,不用去對公告內(nèi)容做修改。滿足了開關(guān)原則的對擴(kuò)展支持對修改關(guān)閉。
簡單工廠模式總結(jié):
優(yōu)點:
* 簡單工廠模式實現(xiàn)了對象創(chuàng)建和使用的分離
缺點:
* 工廠模式集中了所有產(chǎn)品的創(chuàng)建邏輯,職責(zé)過重,一旦出現(xiàn)問題會影響到整個系統(tǒng)
適用場景:
* 適用于創(chuàng)建的對象比較少,由于創(chuàng)建的對象較少,不會造成工廠方法中的業(yè)務(wù)邏輯太過復(fù)雜
* 客戶端只知道傳入工廠類的參數(shù),對于如何創(chuàng)建對象并不關(guān)心
感興趣的朋友可以使用在線HTML/CSS/JavaScript代碼運(yùn)行工具:http://tools.jb51.net/code/HtmlJsRun測試上述代碼運(yùn)行效果。
更多關(guān)于JavaScript相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《javascript面向?qū)ο笕腴T教程》、《JavaScript錯誤與調(diào)試技巧總結(jié)》、《JavaScript數(shù)據(jù)結(jié)構(gòu)與算法技巧總結(jié)》、《JavaScript遍歷算法與技巧總結(jié)》及《JavaScript數(shù)學(xué)運(yùn)算用法總結(jié)》
希望本文所述對大家JavaScript程序設(shè)計有所幫助。
相關(guān)文章
JavaScript實現(xiàn)隨機(jī)點名網(wǎng)頁
這篇文章主要為大家詳細(xì)介紹了JavaScript實現(xiàn)隨機(jī)點名網(wǎng)頁,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-09-09
JS讀取XML文件數(shù)據(jù)并以table形式顯示數(shù)據(jù)的方法(兼容IE與火狐)
這篇文章主要介紹了JS讀取XML文件數(shù)據(jù)并以table形式顯示數(shù)據(jù)的方法,涉及javascript針對xml節(jié)點操作及HTML表格操作的相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下2016-06-06
javascript垃圾收集機(jī)制與內(nèi)存泄漏詳細(xì)解析
本文是對javascript中的垃圾收集機(jī)制與內(nèi)存泄漏進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過來參考下,希望對大家有所幫助2013-11-11

