<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>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                # 工廠三兄弟之工廠方法模式(四) 5 重載的工廠方法 Sunny公司開發人員通過進一步分析,發現可以通過多種方式來初始化日志記錄器,例如可以為各種日志記錄器提供默認實現;還可以為數據庫日志記錄器提供數據庫連接字符串,為文件日志記錄器提供文件路徑;也可以將參數封裝在一個Object類型的對象中,通過Object對象將配置參數傳入工廠類。此時,可以提供一組重載的工廠方法,以不同的方式對產品對象進行創建。當然,對于同一個具體工廠而言,無論使用哪個工廠方法,創建的產品類型均要相同。如圖4所示: ![](http://img.blog.csdn.net/20130712105630406?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvTG92ZUxpb24=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 圖4 重載的工廠方法結構圖 引入重載方法后,抽象工廠LoggerFactory的代碼修改如下: ``` interface LoggerFactory { public Logger createLogger(); public Logger createLogger(String args); public Logger createLogger(Object obj); } ``` 具體工廠類DatabaseLoggerFactory代碼修改如下: ``` class DatabaseLoggerFactory implements LoggerFactory { public Logger createLogger() { //使用默認方式連接數據庫,代碼省略 Logger logger = new DatabaseLogger(); //初始化數據庫日志記錄器,代碼省略 return logger; } public Logger createLogger(String args) { //使用參數args作為連接字符串來連接數據庫,代碼省略 Logger logger = new DatabaseLogger(); //初始化數據庫日志記錄器,代碼省略 return logger; } public Logger createLogger(Object obj) { //使用封裝在參數obj中的連接字符串來連接數據庫,代碼省略 Logger logger = new DatabaseLogger(); //使用封裝在參數obj中的數據來初始化數據庫日志記錄器,代碼省略 return logger; } } //其他具體工廠類代碼省略 ``` 在抽象工廠中定義多個重載的工廠方法,在具體工廠中實現了這些工廠方法,這些方法可以包含不同的業務邏輯,以滿足對不同產品對象的需求。 6 工廠方法的隱藏 有時候,為了進一步簡化客戶端的使用,還可以對客戶端隱藏工廠方法,此時,在工廠類中將直接調用產品類的業務方法,客戶端無須調用工廠方法創建產品,直接通過工廠即可使用所創建的對象中的業務方法。 如果對客戶端隱藏工廠方法,日志記錄器的結構圖將修改為圖5所示: ![](http://img.blog.csdn.net/20130712105654859?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvTG92ZUxpb24=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 圖5 隱藏工廠方法后的日志記錄器結構圖 在圖5中,抽象工廠類LoggerFactory的代碼修改如下: ``` //改為抽象類 abstract class LoggerFactory { //在工廠類中直接調用日志記錄器類的業務方法writeLog() public void writeLog() { Logger logger = this.createLogger(); logger.writeLog(); } public abstract Logger createLogger(); } ``` 客戶端代碼修改如下: ``` class Client { public static void main(String args[]) { LoggerFactory factory; factory = (LoggerFactory)XMLUtil.getBean(); factory.writeLog(); //直接使用工廠對象來調用產品對象的業務方法 } } ``` 通過將業務方法的調用移入工廠類,可以直接使用工廠對象來調用產品對象的業務方法,客戶端無須直接使用工廠方法,在某些情況下我們也可以使用這種設計方案。 7 工廠方法模式總結 工廠方法模式是簡單工廠模式的延伸,它繼承了簡單工廠模式的優點,同時還彌補了簡單工廠模式的不足。工廠方法模式是使用頻率最高的設計模式之一,是很多開源框架和API類庫的核心模式。 1. 主要優點 工廠方法模式的主要優點如下: (1) 在工廠方法模式中,工廠方法用來創建客戶所需要的產品,同時還向客戶隱藏了哪種具體產品類將被實例化這一細節,用戶只需要關心所需產品對應的工廠,無須關心創建細節,甚至無須知道具體產品類的類名。 (2) 基于工廠角色和產品角色的多態性設計是工廠方法模式的關鍵。它能夠讓工廠可以自主確定創建何種產品對象,而如何創建這個對象的細節則完全封裝在具體工廠內部。工廠方法模式之所以又被稱為多態工廠模式,就正是因為所有的具體工廠類都具有同一抽象父類。 (3) 使用工廠方法模式的另一個優點是在系統中加入新產品時,無須修改抽象工廠和抽象產品提供的接口,無須修改客戶端,也無須修改其他的具體工廠和具體產品,而只要添加一個具體工廠和具體產品就可以了,這樣,系統的可擴展性也就變得非常好,完全符合“開閉原則”。 2. 主要缺點 工廠方法模式的主要缺點如下: (1) 在添加新產品時,需要編寫新的具體產品類,而且還要提供與之對應的具體工廠類,系統中類的個數將成對增加,在一定程度上增加了系統的復雜度,有更多的類需要編譯和運行,會給系統帶來一些額外的開銷。 (2) 由于考慮到系統的可擴展性,需要引入抽象層,在客戶端代碼中均使用抽象層進行定義,增加了系統的抽象性和理解難度,且在實現時可能需要用到DOM、反射等技術,增加了系統的實現難度。 3. 適用場景 在以下情況下可以考慮使用工廠方法模式: (1) 客戶端不知道它所需要的對象的類。在工廠方法模式中,客戶端不需要知道具體產品類的類名,只需要知道所對應的工廠即可,具體的產品對象由具體工廠類創建,可將具體工廠類的類名存儲在配置文件或數據庫中。 (2) 抽象工廠類通過其子類來指定創建哪個對象。在工廠方法模式中,對于抽象工廠類只需要提供一個創建產品的接口,而由其子類來確定具體要創建的對象,利用面向對象的多態性和里氏代換原則,在程序運行時,子類對象將覆蓋父類對象,從而使得系統更容易擴展。 練習 使用工廠方法模式設計一個程序來讀取各種不同類型的圖片格式,針對每一種圖片格式都設計一個圖片讀取器,如GIF圖片讀取器用于讀取GIF格式的圖片、JPG圖片讀取器用于讀取JPG格式的圖片。需充分考慮系統的靈活性和可擴展性。
                  <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>

                              哎呀哎呀视频在线观看