<del id="nnjnj"></del><track id="nnjnj"></track>

<p id="nnjnj"></p>

<address id="nnjnj"></address>

    <pre id="nnjnj"><pre id="nnjnj"></pre></pre>

      <noframes id="nnjnj"><ruby id="nnjnj"><ruby id="nnjnj"></ruby></ruby>

      • 自動秒收錄
      • 軟件:1973
      • 資訊:57811|
      • 收錄網站:279872|

      IT精英團

      百度工程師教你玩設計模式(工廠模式)

      百度工程師教你玩設計模式(工廠模式)

      瀏覽次數:
      評論次數:
      編輯: 澤洋
      信息來源: ITPUB
      更新日期: 2022-09-06 21:09:38
      摘要

      作者|北極星小組想要寫好代碼,設計模式(DesignPattern)是必不可少的基本功,設計模式是對面向對象設計(ObjectOrientedDesign)中反復出現的問題的解決方案,本篇介紹

      • 正文開始
      • 相關閱讀
      • 推薦作品

      作者|北極星集團

      要想寫出好的代碼,設計模式是必不可少的基本功。設計模式是面向對象設計中反復出現的問題的解決方案。本文介紹了工廠模式。工廠模式屬于生成器模式,它提供了創建對象的最佳方式。當創建對象時,對象的創建邏輯不會向客戶端公開,但是對象將通過使用公共接口來創建。工廠應用的典型場景是你想創建一個對象,但是創建過程比較復雜,你想隱藏這些細節。比如創建的對象可能在一個池中,而不是每次都憑空創建一個新的;創建對象時,有許多參數決定如何創建它。創建一個對象有復雜的依賴關系。主要有工廠方法模式(簡單工廠模式)、工廠方法模式(工廠方法模式)、抽象工廠(抽象工廠模式)。一、簡單工廠模式在文檔解析場景中的應用

      GEEK TALK在日常開發場景中,如果要創建的產品(創建的對象類)不多,那么只能完成一個工廠類。這種模式被稱為“工廠方法模式”。使用工廠方法模式的客戶端(特定調用方)只需要傳入需要創建產品類的參數,不需要關心如何創建對象的邏輯,就可以輕松創建所需的產品。以Word2007文檔解析場景為例:文檔的主體在document.xml文件中。解析過程中,根據內容結構維度創建段落、表格、Draw等具體解析類。在解析過程中,如果直接構造解析類對應的對象以供使用,它們之間的耦合會太重,而解析類的實際創建可以通過使用“簡單工廠模式”.推遲到工廠類,這也符合創作模式中“創作與使用分離”的要求。具體實現上包括以下幾部分:):它是工廠方法模式的核心,負責實現創建所有具體解析器實例的內部邏輯。

      簡單工廠(SimpleFactory:它是簡單工廠創建的所有對象的父類,負責描述所有解析器實例共享的公共接口。

      抽象產品(Product):它是工廠方法模式的創建目標,負責創建特定的解析類。

      類public docx paser {//抽象產品:公共接口ipaser {void process (stringinty)),所有解析器共享的公共接口;}//具體產品:段落解析器靜態類段落實現ipaser { public void process(string inty){ system . out . println('解析段落. '));} }//具體產品:表解析器靜態類Table實現IPA SER { public void process(string entity){ system . out . println('解析表. '));} }//具體產品:drawparser靜態類drawimplements ipaser {publicvo

      id process(string entity) {System.out.println("解析 Draw...");}}final class Const {static final int ENTITY_PARAGRAPHP = ;static final int ENTITY_TABLE = 1;static final int ENTITY_DRAW = 2;}//簡單工廠:負責實現創建所有具體Parser實例的內部邏輯static class ParserFactory {public static IPaser creatParser(int kind) {switch (kind) {case Const.ENTITY_PARAGRAPHP:return new Paragraph();case Const.ENTITY_TABLE:return new Table();case Const.ENTITY_DRAW:return new Draw();}return null;}}// 簡單使用示例public static void main(String[] args) {//entity 對應document.xml 此處略去具體獲取過程...
      //解析paragraphParserFactory.creatParser(Const.ENTITY_PARAGRAPHP).process(entity)//解析tableParserFactory.creatParser(Const.ENTITY_TABLE).process(entity)//解析drawParserFactory.creatParser(Const.ENTITY_DRAW).process(entity)...}}

      二、工廠方法模式在自動化測試場景的應用

      GEEK TALK在簡單工廠模式中,調用方只需要傳入需要創建的對象類參數,就可以獲得一個需要的對象,而不用關心這個對象的具體創建細節。在需要創建的對象類型較少,而且后續不再輕易增加的情況下簡單工廠模式即可滿足要求。但是針對需要創建的對象種類繁多,而且后續變更較為頻繁的場景下,簡單工廠模式有兩個明顯的問題:
        • 由于后續每次新增一種對象都需要修改工廠類中的判斷邏輯,違反代碼設計中的開閉原則

        • 由于需要對輸入的參數進行判斷然后初始化合適的類,簡單工廠類中 if-else 或者 switch-case分支過多,代碼顯得較為臃腫

      為了解決以上問題,可以選擇工廠方法模式:定義一個創建對象的接口,然后實現不同對象的創建子類,對象的初始化交由各個工廠的子類去完成。他和簡單工廠的區別點在于:
        • 開閉原則:新增對象的情況下,簡單工廠模式下需要修改工廠類,而工廠方法模式只需要新增一個工廠的子類去完成新增對象的初始化即可。

        • 代碼簡潔:簡單工廠通過參數選擇并初始化子類,所有工作都由工廠類完成,工廠方法只是定義了一個創建對象的接口,對象的創建放在子類去實現。

      以前端瀏覽器自動化測試的場景為例,在不同的瀏覽器場景下必須通過對應的瀏覽器驅動才能完成測試的執行,例如常見的Chrome 、Firefox、Safari、IE瀏覽器。這個場景就可以通過工廠方法模式來進行實現。首先是定義場景下的驅動對象,Driver為各個具體驅動需要繼承的抽象類,其他的XDriver為具體某個瀏覽器的驅動對象。接下來定義對應的抽象工廠并實現不同對象初始化的工廠子類,AbstractFactory為抽象工廠,定義了創建驅動對象的接口,其他的每個工廠實現了抽象工廠的接口,并提供對應驅動的初始化能力。最后實際的使用者根據需要選擇某個工廠類即可完成對應的驅動初始化工作
      public class FactoryDemo {
      //抽象對象:所有驅動對象的公共父類abstract static class Driver {abstract void process();}
      // 具體驅動對象:Chrome瀏覽器驅動對象static class ChromeDriver extends Driver {@Overridevoid process() {System.out.println("ChromeDriver process"); // do something}}
      // 具體驅動對象:Firefox瀏覽器驅動對象static class FirefoxDriver extends Driver {@Overridevoid process() {System.out.println("FirefoxDriver process"); // do something}}
      // 具體驅動對象:Safari瀏覽器驅動對象static class SafariDriver extends Driver {@Overridevoid process() {System.out.println("SafariDriver process"); // do something}}
      // 抽象工廠 所有工廠的公共接口public interface AbstractFactory {Driver create();}
      // 具體工廠:負責Chrome瀏覽器驅動對象的創建static class ChromeDriverFactory implements AbstractFactory {@Overridepublic Driver create() {return new ChromeDriver();}}
      // 具體工廠:負責Firefox瀏覽器驅動對象的創建static class FirefoxDriverFactory implements AbstractFactory {@Overridepublic Driver create() {return new FirefoxDriver();}}
      // 具體工廠:負責Safari瀏覽器驅動對象的創建static class SafariDriverFactory implements AbstractFactory {@Overridepublic Driver create() {return new SafariDriver();}}
      public static void main(String[] args) {// 創建 Chrome 驅動對象AbstractFactory chromeDriverFactory = new ChromeDriverFactory();Driver chromeDriver = chromeDriverFactory.create();chromeDriver.process();
      // 創建 Firefox 驅動對象AbstractFactory firefoxDriverFactory = new FirefoxDriverFactory();Driver firefoxDriver = firefoxDriverFactory.create();firefoxDriver.process();
      // ...}}

      三、抽象工廠模式在跨端場景下的應用

      GEEK TALK抽象工廠模式,是對工廠方法模式的進一步深化,工廠方法模式中只有一個抽象方法,要想實現多種不同的類對象,只能去創建不同的具體工廠方法的子類來實列化,而抽象工廠則是讓一個工廠負責創建多個不同類型的對象。以典型的跨端場景為例,用戶可購買會員有多種類型,每種類型的會員在iOS、Android、PC下權益頁稍有不同,并且實例化過程十分復雜。如果不用工廠模式,就需要在每處需要實例的地方,去編寫復雜的實例化代碼,當實例化過程發生修改,也需要每處修改,維護成本非常高。如果用簡單工廠模式或者工廠方法模式,不用抽象工廠模式,就需要每個類型會員實現三個工廠,也不易于維護。在這個場景下,我們可以用抽象工廠模式解決,編寫抽象工廠、會員抽象類,并實現iOS、Android、PC三個具體工廠,根據場景選取需要的具體工廠獲取會員實例。
      //抽象產品public interface Vip {}
      //具體產品public class NormalVip implements Vip {} //普通會員public class MonthlyVip implements Vip {} //包月會員
      public class IOSNormalVip extends NormalVip {}public class AndroidNormalVip extends NormalVip {}public class PCNormalVip extends NormalVip {}
      public class IOSMonthlyVip extends MonthlyVip {}public class AndroidMonthlyVip extends MonthlyVip {?}public class PCMonthlyVip extends MonthlyVip {?}
      //抽象工廠public interface AbstractVipFactory {Vip createNormalVip();Vip createMonthlyVip();}
      //具體工廠public class IOSVipFactory implements AbstractVipFactory {@Overridepublic Vip createNormalVip() {return new IOSNormalVip();}@Overridepublic Vip createMonthlyVip() {return new IOSMonthlyVip();}}...
      //調用示例public class Client {public static void main(String[] args) {IOSVipFactory iosVipFactory = new IOSVipFactory();Vip iosNormalVip = iosVipFactory.createNormalVip();}}

      四、總結

      GEEK TALK通過對以上三個實際案例的講解和具體的代碼實現閱讀,大家對工廠模式的應用場景和具體實現方案應該有了更加深入的了解了。結合以上三個案例的的分析,創建過程復雜時,適合使用工廠模式,常用的工廠模式有:
      • 簡單工廠模式:實例化過程復雜時,可以選用

      • 工廠方法模式:產品結構較復雜時,可以選用

      • 抽象工廠模式:產品種類結構多時,可以選用

      ----------  END  ----------
      標簽:工廠 對象 模式
      舉例說明庫伯內特公司的豆莢核心資源
      ? 上一篇 2022-09-06
      談談動態線程池的9個場景(改進版)
      下一篇 ? 2022-09-06
      • 如何在Ubuntu中保留文件系統并備份當前開發板鏡像
        0閱讀 0條評論 個贊
        在Ubuntu保留文件系統或者說備份當前開發板鏡像的需求在不斷增加。比如Ubuntu文件系統需要安裝庫文件的話直接使用apt-get工具就可以下載,但由于需要下載的核心板較多,比較費時間,這時需要將安……
      • 國產核心板全志T507助力消防系統升級
        0閱讀 0條評論 個贊
        9月16日下午,位于湖南長沙市區內的中國電信大樓發生火災,建筑高度218米,現場濃煙滾滾,數十層樓體燃燒劇烈。消防救援人員趕到現場后很快將火勢控制住,目前大樓火勢已被撲滅,所幸未發現人員傷亡。湖南電信……
      • 教大家如何處理Spring Boot易流中的用戶和群體!
        0閱讀 0條評論 個贊
        1.準備工作2.用戶操作2.1添加用戶2.2修改用戶2.3刪除用戶2.4查詢用戶3.組操作3.1添加組3.2修改組3.3刪除組3.4查詢組4.查看表詳情雖然說我們在實際開發中,……
      • 從PG15開始WAL壓縮優化
        0閱讀 0條評論 個贊
        PG15傳聞中的超級令人激動的功能大多數跳票了,年初我也寫過一個關于PG15新功能跳票的文章。PG15BETA已經發出幾個月了,似乎PG15里令人激動人心的功能不多,不過從長長的新功能列表里,……
      • 深入了解美團葉子發射器開源方案
        0閱讀 0條評論 個贊
        大家好,我是樹哥。之前我們有聊過「如何設計一個分布式ID發號器」,其中有講過4種解決方案,分別是:UUID類雪花算法數據庫自增主鍵Redis原子自增美團以第2、3種解決方案為基礎,開發出……
      發表評論 共有條評論
      用戶名: 密碼:
      驗證碼: 匿名發表
      • MySQL中的存儲過程(詳細文章)
        0閱讀 0條評論 個贊
        文章目錄概述優點缺點MySQL存儲過程的定義存儲過程的基本語句格式存儲過程的使用定義一個存儲過程定義一個有參數的存儲過程定義一個流程控制語句IFELSE定義一個條件控制語句CASE定義一個循環語……
      • 1 Docker安裝Nexus3
        0閱讀 0條評論 個贊
        1.1創建目錄在硬盤上創建Nexus3的主目錄:mkdir-p/Users/yygnb/dockerMe/nexus3為該目錄添加權限:chmod777-R/Users/yygnb/d……
      • Java核心知識系統4: AOP原理和部分應用
        0閱讀 0條評論 個贊
        1概述我們所說的Aop(即面向切面編程),即面向接口,也面向方法,在基于IOC的基礎上實現。Aop最大的特點是對指定的方法進行攔截并增強,這種增強的方式不需要業務代碼進行調整,無需侵入到業務代碼中,……
      • 面試官:談談你對mysql事務的認識?
        0閱讀 0條評論 個贊
        引言今天回頭繼續講講數據庫系列的文章。這篇文章屬于mysql數據庫系列,我們來談談事務方面的常見面試題。那么,具體題目有下面這些:1、講講為什么用事務?事務的四大特性?事務的隔離級別知道吧,你們生產……
      • 記錄在線超時的分析和故障排除過程
        0閱讀 0條評論 個贊
        .css-1yuhvjn{margin-top:16px;}.css-3jt6os.FileLinkCard{-webkit-align-items:center;-webkit-box-align……
      • SQL Server操作系統的任務調度機制
        0閱讀 0條評論 個贊
        簡介SQLServerOS是在Windows之上,用于服務SQLServer的一個用戶級別的操作系統層次。它將操作系統部分的功能從整個SQLServer引擎中抽象出來,單獨形成一層,以便為存……
      • Python自學教程7:字典類型有什么用
        0閱讀 0條評論 個贊
        字典是Python中的一個重要操作,如果字典玩得順,很多其他的數據類型就可以一通百通。Python字典的定義字典使用一對大括號進行定義,鍵值對之間使用逗號隔開,鍵和值使用冒號分隔。鍵必須是不可變類型,……
      • 簡單分析下的GOLDENDB
        0閱讀 0條評論 個贊
        GOLDENDB是金融行業使用的比較廣泛的一個數據庫產品,以前也經常有朋友希望我寫幾篇分析GoldenDB數據庫的文章。說實在的這類文章不好寫,必須對某個產品有一定程度的了解,特別是真正上手用過之后,……
      • 在i.MX8MP開發板中移植OpenSSL工具
        0閱讀 0條評論 個贊
        飛凌嵌入式OKMX8MP-C開發板采用NXPi.MX8MPlus高性能處理器開發,AI計算能力高達2.3TOPS,可滿足輕量級邊緣計算需求。同時靈活的I/O接口配置和先進豐富的多媒體資源,方便客戶……
      • 面試問題:Java序列化和反序列化
        0閱讀 0條評論 個贊
        目錄序列化和反序列化的概念應用場景?序列化實現的方式繼承Serializable接口,普通序列化繼承Externalizable接口,強制自定義序列化serialVersionUID的作用靜態變量不會……
      • k8s網絡持久存儲的StorageClass(如何一步步實現動態持久存儲)
        0閱讀 0條評論 個贊
        StorageClass的作用:創建pv時,先要創建各種固定大小的PV,而這些PV都是手動創建的,當業務量上來時,需要創建很多的PV,過程非常麻煩。而且開發人員在申請PVC資源時,還不一定有匹配條件的……
      • 這三個特點讓G1取代CMS!
        0閱讀 0條評論 個贊
        大家好,我是樹哥。之前我們聊過CMS回收器,但那時候我們說CMS回收器已經落伍了,現在應該是用G1回收器的時候了。那么G1回收器到底有什么魔力,它比CMS回收器相比強在哪里呢?今天……
      • web端pdf編輯能力的設計與實踐
        0閱讀 0條評論 個贊
        本期作者顧伊凡嗶哩嗶哩資深開發工程師2021年加入B站,負責UP主創作激勵、收益中心、電子簽約平臺前端建設。本文將從業務場景與技術實現等角度對“web端pdf編輯能力”進行基本的介紹。01背景B站電……
      • python入門系列(十)學習Python文件處理
        0閱讀 0條評論 個贊
        文件處理在Python中處理文件的關鍵函數是open()函數。有四種不同的方法(模式)來打開一個文件"r"-讀取-默認值。打開一個文件進行讀取,如果文件不存在則出錯。"a"-Append……
      • MySQL性能調優和優化技術
        0閱讀 0條評論 個贊
        介紹MySQL是一種流行的開源數據庫應用程序,它以一種有意義且易于訪問的方式存儲和構造數據。對于大型應用程序,龐大的數據量可能會導致性能問題。本指南提供了一些關于如何提高MySQL數據庫性能的調……
      • 新一代網絡請求庫:python-httpx庫
        0閱讀 0條評論 個贊
        目錄httpx庫一、概述1、簡介2、命令行模式3、快速開始3.1get請求3.2post請求3.2.1表單3.2.2文件3.2.3JSON3.2.4二進制3.3響應處理3.4流……
      • 二戰MySQL數據庫【升華】
        0閱讀 0條評論 個贊
        MYSQL入門系列——第二篇1.篩選條件:(1)比較運算符:(2)邏輯運算符:(3)其他操作:1.排序:2.限制:拓展:3.去重:4.模糊查詢:(like'%')5.范圍查詢:2.聚合與分組(重點……
      • 金牛座入門 MVC微服務框架開發教程:項目部署:4 微服務應用發布到Docker進行部署
        0閱讀 0條評論 個贊
        前言:本篇教程,演示ASP.NETCore微服務應用程序,如何最簡方式發布到Docker中部署,并運行起來。新手兩個簡易概念:1、映像:可以理解為Class,用于定義;2、容器:可以理解為Clas……
      • spring MVC(II)——請求處理參數和響應數據處理
        0閱讀 0條評論 個贊
        1、請求處理參數1.1請求參數@RequestParam1.1.1不使用@RequestParam注解請求參數處理,不使用參數注解:1.如果請求參數名和請求處理的形參名一致,springMv……
      • [設計模式] Java設計模式-橋模式
        0閱讀 0條評論 個贊
        目錄【設計模式】Java設計模式-橋接模式簡介橋接模式實例代碼示例①、品牌接口②、汽車品牌③、抽象汽車類④、汽車類型子類⑤、橋接模式測試1|1簡介橋接(Bridge)是用于把抽象化與實現化解耦,使……
      最近發布資訊
      更多
      警花高潮嗷嗷叫
      <del id="nnjnj"></del><track id="nnjnj"></track>

      <p id="nnjnj"></p>

      <address id="nnjnj"></address>

        <pre id="nnjnj"><pre id="nnjnj"></pre></pre>

          <noframes id="nnjnj"><ruby id="nnjnj"><ruby id="nnjnj"></ruby></ruby>