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

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                **工廠方法模式(Factory Method)** 工廠方法:顧名思義,就是調用工廠里的方法來生產對象(產品)的。 工廠方法實現方式有3種: ### 一、普通工廠模式。就是建立一個工廠類,對實現了同一接口的一些類進行實例的創建。 1、uml建模圖: ![](https://box.kancloud.cn/2016-02-19_56c7196d26a9b.jpg) 2、代碼實現 ~~~ /** * 示例(一):普通工廠方法 * * 缺點:如果傳遞的字符串出錯,則不能正確創建對象 */ interface Sender { public void send(); } class EmailSender implements Sender { @Override public void send() { System.out.println("使用電子郵箱發送..."); } } class SmsSender implements Sender { @Override public void send() { System.out.println("使用短信發送..."); } } /** * 產品工廠 */ class SendFactory { public Sender produceSender(String type) { if ("email".equals(type)) { return new EmailSender(); } else if ("sms".equals(type)) { return new SmsSender(); } else { System.out.println("沒有這種類型..."); return null; } } } /** * 客戶端測試類 * * @author Leo */ public class Test { public static void main(String[] args) { // 創建工廠 SendFactory sendFactory = new SendFactory(); // 生產產品 Sender sender = sendFactory.produceSender("email"); // 發貨 sender.send(); } } ~~~ ### 二、多個工廠方法模式。是對普通工廠方法模式的改進,在普通工廠方法模式中,如果傳遞的字符串出錯,則不能正確創建對象,而多個工廠方法模式是提供多個工廠方法,分別創建對象。 1、uml建模圖: ![](https://box.kancloud.cn/2016-02-19_56c7196d36d29.jpg) 2、代碼實現 ~~~ /** * 示例(二):多個工廠方法 * * 優點:多個工廠方法模式是提供多個工廠方法,分別創建對象 */ interface Sender { public void send(); } class EmailSender implements Sender { @Override public void send() { System.out.println("使用電子郵箱發送..."); } } class SmsSender implements Sender { @Override public void send() { System.out.println("使用短信發送..."); } } /** * 不同方法分別生產相應的產品 */ class SendFactory { public Sender produceEmail() { return new EmailSender(); } public Sender produceSms() { return new SmsSender(); } } /** * 客戶端測試類 * * @author Leo */ public class Test { public static void main(String[] args) { // 創建工廠 SendFactory sendFactory = new SendFactory(); // 生產產品 Sender senderEmail = sendFactory.produceEmail(); // 發貨 senderEmail.send(); } } ~~~ ### 三、靜態工廠方法模式。將上面的多個工廠方法模式里的方法置為靜態的,不需要創建實例,直接調用即可。 1、uml建模圖: ![](https://box.kancloud.cn/2016-02-19_56c7196d441fe.jpg) 2、代碼實現 ~~~ /** * 示例(三):靜態工廠方法 * * 優點:多個工廠方法模式是提供多個工廠方法,分別創建對象 */ interface Sender { public void send(); } class EmailSender implements Sender { @Override public void send() { System.out.println("使用電子郵箱發送..."); } } class SmsSender implements Sender { @Override public void send() { System.out.println("使用短信發送..."); } } /** * 靜態工廠:不同實例化工廠 * * 不同方法分別生產相應的產品 */ class SendFactory { public static Sender produceEmail() { return new EmailSender(); } public static Sender produceSms() { return new SmsSender(); } } /** * 客戶端測試類 * * @author Leo */ public class Test { public static void main(String[] args) { // 直接生產產品 Sender senderEmail = SendFactory.produceEmail(); // 發貨 senderEmail.send(); } } ~~~ ### 四、總結 總體來說,凡是出現了大量的產品需要創建,并且具有共同的接口時,可以通過工廠方法模式進行創建。在以上的三種模式中,第一種如果傳入的字符串有誤,不能正確創建對象,第三種相對于第二種,不需要實例化工廠類,所以,大多數情況下,我們會選用第三種——**靜態工廠方法模式**。
                  <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>

                              哎呀哎呀视频在线观看