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

您的位置:首頁技術(shù)文章
文章詳情頁

JS 設(shè)計模式之:工廠模式定義與實現(xiàn)方法淺析

瀏覽:97日期:2024-05-09 17:05:54

本文實例講述了JS 設(shè)計模式之:工廠模式定義與實現(xiàn)方法。分享給大家供大家參考,具體如下:

前言

上次我們介紹了單例模式,沒看過的小伙伴可以看這個鏈接:

淺析 JS 設(shè)計模式之:單例模式

今天來說一說一種常見的設(shè)計模式:工廠模式。

工廠模式是一種創(chuàng)建對象的 創(chuàng)建型模式,遵循 DRY(Don’t Repeat Yourself)原則。在該模式下,代碼將會根據(jù)具體的輸入或其他既定規(guī)則,自行決定創(chuàng)建哪種類型的對象。簡單點兒說就是,動態(tài)返回需要的實例對象

回顧上次的例子

讓我們繼續(xù)使用單例模式中的例子,一個日志工具 Logger :

class Logger { log (...args) { console.log(...args); }}

上面是最核心的 api,每次使用都需要使用 new Logger() 來創(chuàng)建一個 logger 對象,然后使用方法就和 console 一樣啦~

多種 Logger

假如我們現(xiàn)在的代碼要支持 electron 環(huán)境,即日志既可以是 console 日志,也可以是 file 日志,那么我們就需要有兩種類型的 logger:

ConsoleLogger

// logger/console.jsclass ConsoleLogger { log (...args) { console.log(...args) }}export default ConsoleLoggerFileLogger

// logger/file.jsclass FileLogger { log (...args) { dumpLog(...args) }}export default FileLogger

這里先不用管 dumpLog 的具體實現(xiàn),只用知道它就是將日志寫在文件中的即可~

使用工廠

我們已經(jīng)有了兩種類型的 logger,但是這兩種 logger 的 api 實際上都是一樣的,在項目中直接導(dǎo)入當然也可以使用,只不過每次都要導(dǎo)入對應(yīng)類型的模塊,然后再使用,像下面這樣:

使用 console logger

import ConsoleLogger from ’./logger/console’const logger = new ConsoleLogger()

使用 file logger

import FileLogger from ’./logger/file’const logger = new FileLogger()

是不是很繁瑣?如果還有其他 logger 類型,如遠程日志,就會出現(xiàn)更多種使用方式了。為了把 logger 模塊的使用方式統(tǒng)一,這時候就會用到工廠模式啦~

讓我們新建一個 index.js:

// logger/index.jsimport ConsoleLogger from ’./console.js’import FileLogger from ’./file.js’function createLogger(type = ’console’) { if (type === ’console’) { return new ConsoleLogger() } else if (type === ’file’) { return new FileLogger() } throw new Error(`Logger type not found: ${type}`)}export default createLogger

好了,這下我們的使用方式就會變成這樣:

import createLogger from ’./logger’// console loggerconst logger1 = createLogger(’console’)// file loggerconst logger2 = createLogger(’file’)重構(gòu)一下

上面的 if else 不是很優(yōu)雅?如果有更多中 logger 類型添加起來很麻煩?那我們可以使用對象來映射一下,從而拋棄 if else,同時添加一個 logger 選項。

// logger/index.jsimport ConsoleLogger from ’./console.js’import FileLogger from ’./file.js’const loggerMap = { console: ConsoleLogger, file: FileLogger}// 可選參數(shù)一般放在最后面function createLogger(options, type = ’console’) { const Logger = loggerMap[type] if (Logger) { return new Logger(options) } throw new Error(`Logger type not found: ${type}`)}上面這種封裝的方式,其實也符合 SOLID 原則中的 開閉原則,即 對擴展開放,對修改關(guān)閉,每當我們添加一種 logger 類型時,只需要新增一個文件,然后將構(gòu)造器注冊進 loggerMap 中即可。而外面的使用方式都是不變的,這樣就用最少的修改完成了功能的新增,是不是很棒呀~總結(jié)

下面我們來回顧一下工廠模式的優(yōu)點:

動態(tài)創(chuàng)建對象:可以用于需要在 運行時 確定對象類型的情況。 抽象:封裝了對象創(chuàng)建的細節(jié),用戶不會接觸到對象的構(gòu)造器,只需要告訴工廠需要哪種對象。 可用性 / 可維護性:將相似的對象用一個工廠管理,提供統(tǒng)一的創(chuàng)建接口,滿足 開閉原則,使我們可以輕松添加多種類型的對象,而無需修改大量代碼。

好啦~!工廠模式就介紹到這里啦~ 下次我們講一講裝飾器模式~

參考內(nèi)容 JavaScript Object Oriented Patterns: Factory Pattern 《JavaScript 設(shè)計模式》 《JavaScript 面向?qū)ο缶幊讨改稀?p>感興趣的朋友可以使用在線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ù)學(xué)運算用法總結(jié)》

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

標簽: JavaScript
相關(guān)文章:
主站蜘蛛池模板: 篮球架_乒乓球台_足球门_校园_竞技体育器材_厂家_价格-沧州浩然体育器材有限公司 | 郑州巴特熔体泵有限公司专业的熔体泵,熔体齿轮泵与换网器生产厂家 | 分轨 | 上传文件,即刻分离人声和伴奏 | 塑料造粒机「厂家直销」-莱州鑫瑞迪机械有限公司 | 厌氧工作站-通用型厌氧工作站-上海胜秋科学仪器有限公司 | 广州冷却塔维修厂家_冷却塔修理_凉水塔风机电机填料抢修-广东康明节能空调有限公司 | 法兰连接型电磁流量计-蒸汽孔板节流装置流量计-北京凯安达仪器仪表有限公司 | 驾驶式洗地机/扫地机_全自动洗地机_工业洗地机_荣事达工厂官网 | 塑木弯曲试验机_铜带拉伸强度试验机_拉压力测试台-倾技百科 | 考勤系统_考勤管理系统_网络考勤软件_政企|集团|工厂复杂考勤工时统计排班管理系统_天时考勤 | 大连海岛旅游网>>大连旅游,大连海岛游,旅游景点攻略,海岛旅游官网 | 佛山市德信昌电子有限公司| 杭州厂房降温,车间降温设备,车间通风降温,厂房降温方案,杭州嘉友实业爽风品牌 | 济南品牌设计-济南品牌策划-即合品牌策划设计-山东即合官网 | 恒温恒湿试验箱厂家-高低温试验箱维修价格_东莞环仪仪器_东莞环仪仪器 | 郑州爱婴幼师学校_专业幼师培训_托育师培训_幼儿教育培训学校 | 广域铭岛Geega(际嘉)工业互联网平台-以数字科技引领行业跃迁 | 不锈钢复合板厂家_钛钢复合板批发_铜铝复合板供应-威海泓方金属复合材料股份有限公司 | 自动配料系统_称重配料控制系统厂家| Jaeaiot捷易科技-英伟达AI显卡模组/GPU整机服务器供应商 | 手机存放柜,超市储物柜,电子储物柜,自动寄存柜,行李寄存柜,自动存包柜,条码存包柜-上海天琪实业有限公司 | 自清洗过滤器-全自动自清洗过反冲洗过滤器 - 中乂(北京)科技有限公司 | 重庆磨床过滤机,重庆纸带过滤机,机床伸缩钣金,重庆机床钣金护罩-重庆达鸿兴精密机械制造有限公司 | 三效蒸发器_多效蒸发器价格_四效三效蒸发器厂家-青岛康景辉 | 舞台木地板厂家_体育运动木地板_室内篮球馆木地板_实木运动地板厂家_欧氏篮球地板推荐 | 特种阀门-调节阀门-高温熔盐阀-镍合金截止阀-钛阀门-高温阀门-高性能蝶阀-蒙乃尔合金阀门-福建捷斯特阀门制造有限公司 | 踏板力计,制动仪,非接触多功能速度仪,逆反射系数测试仪-创宇 | Magnescale探规,Magnescale磁栅尺,Magnescale传感器,Magnescale测厚仪,Mitutoyo光栅尺,笔式位移传感器-苏州连达精密量仪有限公司 | 青海电动密集架_智能密集架_密集架价格-盛隆柜业青海档案密集架厂家 | 海德莱电力(HYDELEY)-无功补偿元器件生产厂家-二十年专业从事电力电容器 | 金属波纹补偿器厂家_不锈钢膨胀节价格_非金属伸缩节定制-庆达补偿器 | 正压送风机-多叶送风口-板式排烟口-德州志诺通风设备 | 室内室外厚型|超薄型|非膨胀型钢结构防火涂料_隧道专用防火涂料厂家|电话|价格|批发|施工 | 深圳昂为官网-气体分析仪,沼气分析仪,动态配气仪,气体传感器厂家 | 吹塑加工_大型吹塑加工_滚塑代加工-莱力奇吹塑加工有限公司 | 临沂招聘网_人才市场_招聘信息_求职招聘找工作请认准【马头商标】 | 二次元影像仪|二次元测量仪|拉力机|全自动影像测量仪厂家_苏州牧象仪器 | 能耗监测系统-节能监测系统-能源管理系统-三水智能化 | 彭世修脚_修脚加盟_彭世修脚加盟_彭世足疗加盟_足疗加盟连锁_彭世修脚技术培训_彭世足疗 | 广州物流公司_广州货运公司_广州回程车运输 - 万信物流 | 科昊仪器超纯水机系统-可成气相液氮罐-美菱超低温冰箱-西安昊兴生物科技有限公司 |