Java設計模式菜鳥系列(四)工廠方法模式建模與實現
阿新 • • 發佈:2019-01-04
工廠方法模式(Factory Method)
工廠方法:顧名思義,就是呼叫工廠裡的方法來生產物件(產品)的。
工廠方法實現方式有3種:
一、普通工廠模式。就是建立一個工廠類,對實現了同一介面的一些類進行例項的建立。
1、uml建模圖:
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建模圖:
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建模圖:
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(); } }
四、總結
總體來說,凡是出現了大量的產品需要建立,並且具有共同的介面時,可以通過工廠方法模式進行建立。在以上的三種模式中,第一種如果傳入的字串有誤,不能正確建立物件,第三種相對於第二種,不需要例項化工廠類,所以,大多數情況下,我們會選用第三種——靜態工廠方法模式。