最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

javascript設(shè)計模式 – 簡單工廠模式原理與應(yīng)用實例分析

 更新時間:2020年04月09日 08:52:37   作者:李小強  
這篇文章主要介紹了javascript設(shè)計模式 – 簡單工廠模式,結(jié)合實例形式分析了javascript簡單工廠模式基本概念、原理、定義、應(yīng)用場景及操作注意事項,需要的朋友可以參考下

本文實例講述了javascript設(shè)計模式 – 簡單工廠模式。分享給大家供大家參考,具體如下:

介紹:簡單工廠模式是最常用的一類創(chuàng)建型設(shè)計模式。其中簡單工廠模式并不屬于GoF23個經(jīng)典設(shè)計模式,它通常被作為學習其他工廠模式的基礎(chǔ)。

定義:定義一個工廠類,它可以根據(jù)參數(shù)的不同返回不同的實例,被創(chuàng)建的實例通常都具有相同的父類,因為在簡單工廠模式中創(chuàng)建實例的方法是靜態(tài)方法,因此簡單工廠模式又被稱為靜態(tài)工廠方法模式,它屬于類創(chuàng)建型模式。

場景:我們需要寫一個dialog工具類,在項目初期我們只需要考慮一個簡單的彈窗實現(xiàn),項目持續(xù)迭代,會衍生出各種類型的彈窗,帶關(guān)閉按鈕的,帶確認按鈕的…..

我見到最多的做法是根據(jù)一個type值來判斷當前需要彈什么類型的窗口,這樣的設(shè)計我之前沒覺得有問題,但是看了前面介紹的設(shè)計原則,我們也來分析下這么做的缺點:

1. 存在多個if…else…代碼塊,代碼冗長,閱讀困難,維護困難,測試困難,影響系統(tǒng)性能。
2. dialog類職責過重,負責初始化所有彈窗實例,違反了單一職責原則,不利于重用和維護。
3. 當需要新增彈窗類型是,必須修改源代碼,違反了開關(guān)原則。
4. 不同種類彈窗基礎(chǔ)樣式相同,會導致存在大量重復(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ù)代碼,將每種情況特有的代碼抽取出來,解決了不符合單一職責原則的問題。

重要的是將所有彈窗的創(chuàng)建集中在工廠類中,當有修改時,只需要修改工廠類即可,不會影響業(yè)務(wù)代碼。

這里我們思考一下:1.如何去掉那些if…else…? 2.當我要新增一個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>

這樣當我做新增時,只需要要新增一條配置即可,不用去對公告內(nèi)容做修改。滿足了開關(guān)原則的對擴展支持對修改關(guān)閉。

簡單工廠模式總結(jié):

優(yōu)點:
* 簡單工廠模式實現(xiàn)了對象創(chuàng)建和使用的分離

缺點:
* 工廠模式集中了所有產(chǎn)品的創(chuàng)建邏輯,職責過重,一旦出現(xiàn)問題會影響到整個系統(tǒng)

適用場景:
* 適用于創(chuàng)建的對象比較少,由于創(chuàng)建的對象較少,不會造成工廠方法中的業(yè)務(wù)邏輯太過復(fù)雜
* 客戶端只知道傳入工廠類的參數(shù),對于如何創(chuàng)建對象并不關(guān)心

感興趣的朋友可以使用在線HTML/CSS/JavaScript代碼運行工具http://tools.jb51.net/code/HtmlJsRun測試上述代碼運行效果。

更多關(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ù)學運算用法總結(jié)

希望本文所述對大家JavaScript程序設(shè)計有所幫助。

相關(guān)文章

  • JS實現(xiàn)簡易的圖片拖拽排序?qū)嵗a

    JS實現(xiàn)簡易的圖片拖拽排序?qū)嵗a

    這篇文章主要介紹了JS實現(xiàn)簡易的圖片拖拽排序?qū)嵗a,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-06-06
  • 使用javascript提交form表單方法匯總

    使用javascript提交form表單方法匯總

    這篇文章主要介紹了通過a標簽的超鏈接提交form表單方法匯總,十分的全面細致,也很實用,有需要的小伙伴可以參考下。
    2015-06-06
  • 通過sails和阿里大于實現(xiàn)短信驗證

    通過sails和阿里大于實現(xiàn)短信驗證

    本篇文章主要介紹了通過sails和阿里大于實現(xiàn)短信驗證的方法。具有一定的參考價值,下面跟著小編一起來看下吧
    2017-01-01
  • JS利用中介模式開發(fā)全局控制器

    JS利用中介模式開發(fā)全局控制器

    這篇文章主要為大家介紹了JS利用中介模式開發(fā)全局控制器圖文示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-09-09
  • JavaScript實現(xiàn)隨機點名網(wǎng)頁

    JavaScript實現(xiàn)隨機點名網(wǎng)頁

    這篇文章主要為大家詳細介紹了JavaScript實現(xiàn)隨機點名網(wǎng)頁,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • JavaScript AJAX之惰性載入函數(shù)

    JavaScript AJAX之惰性載入函數(shù)

    這篇文章主要介紹了JavaScript AJAX之惰性載入函數(shù),惰性載入表示函數(shù)執(zhí)行的分支僅會發(fā)生1次,是種JS的優(yōu)化技巧,需要的朋友可以參考下
    2014-08-08
  • JS讀取XML文件數(shù)據(jù)并以table形式顯示數(shù)據(jù)的方法(兼容IE與火狐)

    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 prototype 使用介紹

    JavaScript prototype 使用介紹

    用過JavaScript的同學們肯定都對prototype如雷貫耳,但是這究竟是個什么東西卻讓初學者莫衷一是,只知道函數(shù)都會有一個prototype屬性,可以為其添加函數(shù)供實例訪問,其它的就不清楚了,最近看了一些 JavaScript高級程序設(shè)計,終于揭開了其神秘面紗
    2013-08-08
  • javascript垃圾收集機制與內(nèi)存泄漏詳細解析

    javascript垃圾收集機制與內(nèi)存泄漏詳細解析

    本文是對javascript中的垃圾收集機制與內(nèi)存泄漏進行了詳細的分析介紹,需要的朋友可以過來參考下,希望對大家有所幫助
    2013-11-11
  • js前端實現(xiàn)圖片壓縮上傳的示例代碼

    js前端實現(xiàn)圖片壓縮上傳的示例代碼

    這篇文章主要為大家詳細介紹了js前端如何實現(xiàn)圖片壓縮上傳的效果,文中的示例代碼講解詳細,具有一定的學習價值,有需要的小伙伴可以參考一下
    2023-11-11

最新評論

嵊泗县| 成都市| 拉萨市| 双桥区| 宝丰县| 宽甸| 朝阳县| 法库县| 灵丘县| 彭山县| 元阳县| 钟祥市| 正阳县| 垦利县| 星子县| 安化县| 庆云县| 锡林浩特市| 滁州市| 扶余县| 江华| 治县。| 闵行区| 盐亭县| 涡阳县| 平陆县| 横山县| 额尔古纳市| 江都市| 黄陵县| 永兴县| 西宁市| 安新县| 华阴市| 从江县| 岳阳县| 平邑县| 松溪县| 上高县| 乐业县| 轮台县|