电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

javascript設計模式 ? 簡單工廠模式原理與應用實例分析

瀏覽:8日期:2023-11-05 09:05:40

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

介紹:簡單工廠模式是最常用的一類創建型設計模式。其中簡單工廠模式并不屬于GoF23個經典設計模式,它通常被作為學習其他工廠模式的基礎。

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

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

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

1. 存在多個if…else…代碼塊,代碼冗長,閱讀困難,維護困難,測試困難,影響系統性能。2. dialog類職責過重,負責初始化所有彈窗實例,違反了單一職責原則,不利于重用和維護。3. 當需要新增彈窗類型是,必須修改源代碼,違反了開關原則。4. 不同種類彈窗基礎樣式相同,會導致存在大量重復代碼。5. 各類彈窗的創建和使用都是在各個業務邏輯中,如果我想修改創建方式必須修改所有業務代碼,違反了開關原則

示例:

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的示例寫了一個,實現的方式有很多種,你可以用原型鏈,用繼承來實現都可以。我們這里主要討論下為什么要這么寫。

之前我們列出了5個缺點:我們主要解決了2,4和5,將共有的方法屬性抽取出來寫在父類上,減少了重復代碼,將每種情況特有的代碼抽取出來,解決了不符合單一職責原則的問題。

重要的是將所有彈窗的創建集中在工廠類中,當有修改時,只需要修改工廠類即可,不會影響業務代碼。

這里我們思考一下:1.如何去掉那些if…else…? 2.當我要新增一個error類型的彈窗時如何滿足開關原則?

我自己試了一下:

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>

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

簡單工廠模式總結:

優點:* 簡單工廠模式實現了對象創建和使用的分離

缺點:* 工廠模式集中了所有產品的創建邏輯,職責過重,一旦出現問題會影響到整個系統

適用場景:* 適用于創建的對象比較少,由于創建的對象較少,不會造成工廠方法中的業務邏輯太過復雜* 客戶端只知道傳入工廠類的參數,對于如何創建對象并不關心

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

更多關于JavaScript相關內容感興趣的讀者可查看本站專題:《javascript面向對象入門教程》、《JavaScript錯誤與調試技巧總結》、《JavaScript數據結構與算法技巧總結》、《JavaScript遍歷算法與技巧總結》及《JavaScript數學運算用法總結》

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

標簽: JavaScript
相關文章:
主站蜘蛛池模板: 风淋室生产厂家报价_传递窗|送风口|臭氧机|FFU-山东盛之源净化设备 | 过跨车_过跨电瓶车_过跨转运车_横移电动平车_厂区转运车_无轨转运车 | 温湿度记录纸_圆盘_横河记录纸|霍尼韦尔记录仪-广州汤米斯机电设备有限公司 | 机器视觉检测系统-视觉检测系统-机器视觉系统-ccd检测系统-视觉控制器-视控一体机 -海克易邦 | Copeland/谷轮压缩机,谷轮半封闭压缩机,谷轮涡旋压缩机,型号规格,技术参数,尺寸图片,价格经销商 CTP磁天平|小电容测量仪|阴阳极极化_双液系沸点测定仪|dsj电渗实验装置-南京桑力电子设备厂 | 步进电机_agv电机_伺服马达-伺服轮毂电机-和利时电机 | 工装定制/做厂家/公司_工装订做/制价格/费用-北京圣达信工装 | 辐射仪|辐射检测仪|辐射巡测仪|个人剂量报警仪|表面污染检测仪|辐射报警仪|辐射防护网 | 生产加气砖设备厂家很多,杜甫机械加气砖设备价格公道 | 新密高铝耐火砖,轻质保温砖价格,浇注料厂家直销-郑州荣盛窑炉耐火材料有限公司 | 河南空气能热水器-洛阳空气能采暖-洛阳太阳能热水工程-洛阳润达高科空气能商行 | 臭氧灭菌箱-油桶加热箱-原料桶加热融化烘箱-南京腾阳干燥设备厂 臭氧发生器_臭氧消毒机 - 【同林品牌 实力厂家】 | 扒渣机,铁水扒渣机,钢水扒渣机,铁水捞渣机,钢水捞渣机-烟台盛利达工程技术有限公司 | 全自动五线打端沾锡机,全自动裁线剥皮双头沾锡机,全自动尼龙扎带机-东莞市海文能机械设备有限公司 | BOE画框屏-触摸一体机-触控查询一体机-触摸屏一体机价格-厂家直销-触发电子 | 隧道窑炉,隧道窑炉厂家-山东艾瑶国际贸易 | 医疗仪器模块 健康一体机 多参数监护仪 智慧医疗仪器方案定制 血氧监护 心电监护 -朗锐慧康 | 电竞学校_电子竞技培训学校学院-梦竞未来电竞学校官网 | 道达尔润滑油-食品级润滑油-道达尔导热油-合成导热油,深圳道达尔代理商合-深圳浩方正大官网 | 精密模具-双色注塑模具加工-深圳铭洋宇通 | 对辊破碎机_四辊破碎机_双齿辊破碎机_华盛铭重工 | 加气混凝土砌块设备,轻质砖设备,蒸养砖设备,新型墙体设备-河南省杜甫机械制造有限公司 | 石家庄装修设计_室内家装设计_别墅装饰装修公司-石家庄金舍装饰官网 | RS系列电阻器,RK_RJ启动调整电阻器,RQ_RZ电阻器-上海永上电器有限公司 | 云南丰泰挖掘机修理厂-挖掘机维修,翻新,再制造的大型企业-云南丰泰工程机械维修有限公司 | 超声波焊接机,振动摩擦焊接机,激光塑料焊接机,超声波焊接模具工装-德召尼克(常州)焊接科技有限公司 | 气象监测系统_气象传感器_微型气象仪_气象环境监测仪-山东风途物联网 | 酒精检测棒,数显温湿度计,酒安酒精测试仪,酒精检测仪,呼气式酒精检测仪-郑州欧诺仪器有限公司 | 穿线管|波纹穿线管|包塑金属软管|蛇皮管?闵彬专注弱电工程? | 冻干机(冷冻干燥机)_小型|实验型|食品真空冷冻干燥机-松源 | LOGO设计_品牌设计_VI设计 - 特创易 | cnc精密加工_数控机械加工_非标平键定制生产厂家_扬州沃佳机械有限公司 | elisa试剂盒价格-酶联免疫试剂盒-猪elisa试剂盒-上海恒远生物科技有限公司 | 济南保安公司加盟挂靠-亮剑国际安保服务集团总部-山东保安公司|济南保安培训学校 | 科威信洗净科技,碳氢清洗机,超声波清洗机,真空碳氢清洗机 | 工业胀紧套_万向节联轴器_链条-规格齐全-型号选购-非标订做-厂家批发价格-上海乙谛精密机械有限公司 | 知企服务-企业综合服务(ZiKeys.com)-品优低价、种类齐全、过程管理透明、速度快捷高效、放心服务,知企专家! | 深圳美安可自动化设备有限公司,喷码机,定制喷码机,二维码喷码机,深圳喷码机,纸箱喷码机,东莞喷码机 UV喷码机,日期喷码机,鸡蛋喷码机,管芯喷码机,管内壁喷码机,喷码机厂家 | 氧化锆纤维_1800度高温退火炉_1800度高温烧结炉-南京理工宇龙新材料股份有限公司 | 双杰天平-国产双杰电子天平-美国双杰-常熟双杰仪器 | 活动策划,舞台搭建,活动策划公司-首选美湖上海活动策划公司 |