javascript設(shè)計(jì)模式 – 抽象工廠模式原理與應(yīng)用實(shí)例分析
本文實(shí)例講述了javascript設(shè)計(jì)模式 – 抽象工廠模式原理與應(yīng)用。分享給大家供大家參考,具體如下:
介紹:基于工廠模式,繼續(xù)升級(jí)。來解決工廠模式存在多個(gè)工廠類的問題。主要的思想是將一些相關(guān)的產(chǎn)品組成一個(gè)產(chǎn)品族,由同一個(gè)工廠來統(tǒng)一生產(chǎn)。
定義:抽象工廠模式提供一個(gè)創(chuàng)建一系列相關(guān)或相互依賴的接口,而無須指定他們具體的類。抽象工廠模式又稱kit模式,它是一種對(duì)象創(chuàng)建型模式。
場(chǎng)景:還是上面的Dialog類,如果繼續(xù)向后發(fā)展,會(huì)有各種各樣的彈窗,如果新增一個(gè)彈窗包含了notice和toast。這樣的情況下,我們不需要再單獨(dú)新增一個(gè)工廠類。我們需要對(duì)這一類具有同樣特征的彈窗進(jìn)行聚合。
示例:
var Dialog = function(){ this.show = function(){ console.log(this.name + ' is show -> ' + this.element); } }; Dialog.createNotice = function(){ var _dialog = new Dialog(); _dialog.element = '<div>notice</div>'; _dialog.name = 'notice'; return _dialog; }; Dialog.createToast = function(){ var _dialog = new Dialog(); _dialog.element = '<div>toast</div>'; _dialog.name = 'toast'; return _dialog; }; Dialog.createWarnin = function(){ var _dialog = new Dialog(); _dialog.element = '<div>warnin</div>'; _dialog.name = 'warnin'; return _dialog; }; var Factory = {}; Factory.ConvergeFactory = function(){ return { getNotice: function(){ return Dialog.createNotice(); }, getToast: function(){ return Dialog.createToast(); }, getWarnin: function(){ return Dialog.createWarnin(); } } } var converge = Factory.ConvergeFactory(); var notice = converge.getNotice(); var toast = converge.getToast(); var warnin = converge.getWarnin(); notice.show(); //notice is show -> <div>notice</div> toast.show(); //toast is show -> <div>toast</div> warnin.show(); //warnin is show -> <div> warnin </div>
抽象工廠模式主要解決的是Factory過多的問題,經(jīng)過組合產(chǎn)生新的產(chǎn)品族。
我們這里的舉例有些牽強(qiáng),換個(gè)場(chǎng)景,如果我們有很多按鈕啊,輸入框之類的組件,要通過單獨(dú)的工廠進(jìn)行獲取實(shí)例。
抽象工廠模式就是將特定的組件經(jīng)過聚合產(chǎn)生新的工廠。
但這樣的結(jié)果好還是不好,增加新的產(chǎn)品族時(shí)遵守了開關(guān)原則,但是在對(duì)新的產(chǎn)品族結(jié)構(gòu)進(jìn)行修改時(shí)就會(huì)發(fā)現(xiàn)需要從業(yè)務(wù)到工廠到子類挨個(gè)修改,也違反了開關(guān)原則。
所以抽象工廠模式的使用場(chǎng)景需要特別嚴(yán)謹(jǐn),要在設(shè)計(jì)之初全面考慮,不要輕易對(duì)產(chǎn)品族結(jié)構(gòu)進(jìn)行修改。
抽象工廠模式總結(jié):
優(yōu)點(diǎn):
* 當(dāng)產(chǎn)品族被使用后,隔離了具體類的實(shí)現(xiàn)
* 新增產(chǎn)品族時(shí)很方便,無需修改已有結(jié)構(gòu),符合開關(guān)原則
缺點(diǎn):
* 修改已有產(chǎn)品族結(jié)構(gòu)時(shí),需要修改工廠以及所有使用的業(yè)務(wù)代碼。
前面我們介紹了三種工廠模式,在前端使用的過程中,要靈活的應(yīng)用,使用其思想而不是生搬硬套。
工廠模式核心是通過不同參數(shù)來生成不同產(chǎn)品。抽象工廠和工廠是在實(shí)際場(chǎng)景下進(jìn)行優(yōu)化而來。
這也提醒我們,要不斷地對(duì)代碼進(jìn)行思考,進(jìn)行優(yōu)化。
感興趣的朋友可以使用在線HTML/CSS/JavaScript代碼運(yùn)行工具:http://tools.jb51.net/code/HtmlJsRun測(cè)試上述代碼運(yùn)行效果。
更多關(guān)于JavaScript相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《javascript面向?qū)ο笕腴T教程》、《JavaScript錯(cuò)誤與調(diào)試技巧總結(jié)》、《JavaScript數(shù)據(jù)結(jié)構(gòu)與算法技巧總結(jié)》、《JavaScript遍歷算法與技巧總結(jié)》及《JavaScript數(shù)學(xué)運(yùn)算用法總結(jié)》
希望本文所述對(duì)大家JavaScript程序設(shè)計(jì)有所幫助。
相關(guān)文章
解決bootstrap中使用modal加載kindeditor時(shí)彈出層文本框不能輸入的問題
這篇文章主要介紹了解決bootstrap中使用modal加載kindeditor時(shí)彈出層文本框不能輸入的問題,需要的朋友可以參考下2017-06-06微信小程序生成海報(bào)分享朋友圈的實(shí)現(xiàn)方法
利用微信強(qiáng)大的社交能力通過小程序達(dá)到裂變的目的,拉取新用戶。下面小編給大家?guī)砹宋⑿判〕绦蛏珊?bào)分享朋友圈的實(shí)現(xiàn)方法,感興趣的朋友跟隨小編一起看看吧2019-05-05javascript將數(shù)組插入到另一個(gè)數(shù)組中的代碼
下面的代碼主要功能就是將數(shù)組arr2插入到數(shù)組arr1的index位置,需要的朋友可以參考下2013-01-01不用typsescript如何使用類型增強(qiáng)功能
這篇文章主要給大家介紹了關(guān)于不用typsescript如何使用類型增強(qiáng)功能的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03javascript 函數(shù)參數(shù)原來是可以有缺省值的
前幾天看 javaEye 時(shí)看到一個(gè)童鞋寫的 getElementsByClassName 函數(shù)。2010-07-07詳解webpack打包時(shí)排除其中一個(gè)css、js文件或單獨(dú)打包一個(gè)css、js文件(兩種方法)
本文通過兩種方法給大家介紹了webpack打包時(shí)排除其中一個(gè)css、js文件,或單獨(dú)打包一個(gè)css、js文件的方法 ,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-10-10