<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                # 工廠三兄弟之工廠方法模式(一) 簡單工廠模式雖然簡單,但存在一個很嚴重的問題。當系統中需要引入新產品時,由于靜態工廠方法通過所傳入參數的不同來創建不同的產品,這必定要修改工廠類的源代碼,將違背“開閉原則”,如何實現增加新產品而不影響已有代碼?工廠方法模式應運而生,本文將介紹第二種工廠模式——工廠方法模式。 1 日志記錄器的設計 Sunny軟件公司欲開發一個系統運行日志記錄器(Logger),該記錄器可以通過多種途徑保存系統的運行日志,如通過文件記錄或數據庫記錄,用戶可以通過修改配置文件靈活地更換日志記錄方式。在設計各類日志記錄器時,Sunny公司的開發人員發現需要對日志記錄器進行一些初始化工作,初始化參數的設置過程較為復雜,而且某些參數的設置有嚴格的先后次序,否則可能會發生記錄失敗。如何封裝記錄器的初始化過程并保證多種記錄器切換的靈活性是Sunny公司開發人員面臨的一個難題。 Sunny公司的開發人員通過對該需求進行分析,發現該日志記錄器有兩個設計要點: (1) 需要封裝日志記錄器的初始化過程,這些初始化工作較為復雜,例如需要初始化其他相關的類,還有可能需要讀取配置文件(例如連接數據庫或創建文件),導致代碼較長,如果將它們都寫在構造函數中,會導致構造函數龐大,不利于代碼的修改和維護; (2) 用戶可能需要更換日志記錄方式,在客戶端代碼中需要提供一種靈活的方式來選擇日志記錄器,盡量在不修改源代碼的基礎上更換或者增加日志記錄方式。 Sunny公司開發人員最初使用簡單工廠模式對日志記錄器進行了設計,初始結構如圖1所示: ![](http://img.blog.csdn.net/20130712094545500?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvTG92ZUxpb24=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 圖1 基于簡單工廠模式設計的日志記錄器結構圖 在圖1中,LoggerFactory充當創建日志記錄器的工廠,提供了工廠方法createLogger()用于創建日志記錄器,Logger是抽象日志記錄器接口,其子類為具體日志記錄器。其中,工廠類LoggerFactory代碼片段如下所示: ``` //日志記錄器工廠 class LoggerFactory { //靜態工廠方法 public static Logger createLogger(String args) { if(args.equalsIgnoreCase("db")) { //連接數據庫,代碼省略 //創建數據庫日志記錄器對象 Logger logger = new DatabaseLogger(); //初始化數據庫日志記錄器,代碼省略 return logger; } else if(args.equalsIgnoreCase("file")) { //創建日志文件 //創建文件日志記錄器對象 Logger logger = new FileLogger(); //初始化文件日志記錄器,代碼省略 return logger; } else { return null; } } } ``` 為了突出設計重點,我們對上述代碼進行了簡化,省略了具體日志記錄器類的初始化代碼。在LoggerFactory類中提供了靜態工廠方法createLogger(),用于根據所傳入的參數創建各種不同類型的日志記錄器。通過使用簡單工廠模式,我們將日志記錄器對象的創建和使用分離,客戶端只需使用由工廠類創建的日志記錄器對象即可,無須關心對象的創建過程,但是我們發現,雖然簡單工廠模式實現了對象的創建和使用分離,但是仍然存在如下兩個問題: (1) 工廠類過于龐大,包含了大量的if…else…代碼,導致維護和測試難度增大; (2) 系統擴展不靈活,如果增加新類型的日志記錄器,必須修改靜態工廠方法的業務邏輯,違反了“開閉原則”。 如何解決這兩個問題,提供一種簡單工廠模式的改進方案?這就是本文所介紹的工廠方法模式的動機之一。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看