工廠模式是咱們最經常使用的實例化對象模式了,是用工廠方法代替new操做的一種模式。由於工廠模式就至關於建立實例對象的new,咱們常常要根據類Class生成實例對象。咱們在new大量同類時,儘可能使用工廠模式,可以提升解耦和可擴展性。java
接口 public interface Sender { public void Send(); } 類1 public class SmsSender implements Sender { @Override public void Send() { System.out.println("this is sms sender!"); } } 類2 public class MailSender implements Sender { @Override public void Send() { System.out.println("this is mailSender"); } }
public class CommonFactory { /** * @see 不一樣工廠類。輸入名稱 * @param type * @return */ public Sender produce(String type) { if ("mail".equals(type)) { return new MailSender(); } else if ("sms".equals(type)) { return new SmsSender(); } else { System.out.println("right type inside,place!"); return null; } } }
public class MultiFactory { /** * @See 多個工廠方法 * @see 缺點:若是須要添加新的方法,則須要修改源碼 */ public Sender produceMail() { return new MailSender(); } public Sender produceSms() { return new SmsSender(); } // 靜態工廠 public static Sender produceMailTwo() { return new MailSender(); } public static Sender produceSmsTwo() { return new SmsSender(); } }
// 工廠接口 public interface Provider { /** * @see 工廠接口、每個新的類只須要建立一個實現一個工廠接口 * @return */ Sender produce(); } //每個基類都實現一個工廠 public class SmsFactory implements Provider { @Override public Sender produce() { return new SmsSender(); } } public class MailFactory implements Provider { @Override public Sender produce() { return new MailSender(); } }
public static void main(String[] args) { // 1.普通:經過名字來實現。須要擴展必須修改源碼 // CommonFactory cf = new CommonFactory(); // Sender sender = cf.produce("sms"); // sender.Send(); // 2.工廠方法:須要擴展必須修改源碼 // MultiFactory mf = new MultiFactory(); // Sender sender = mf.produceMail(); // sender.Send(); // 3.靜態工廠方法:須要擴展必須修改源碼 // Sender sender = MultiFactory.produceMailTwo(); // sender.Send(); // 4.抽象工廠方法:須要擴展直接建立一個工廠接口的工廠(這個用法和行爲模式比較相似) Provider provider = new SmsFactory(); Sender sender = provider.produce(); sender.Send(); } }