簡單工廠模式是工廠模式家族中最簡單實用的模式,能夠理解爲是不一樣工廠模式的一個特殊實現。該模式不屬於23種GOF設計模式。簡單工廠通常分爲:普通簡單工廠、多方法簡單工廠、靜態方法簡單工廠。java
1)工廠類負責建立的對象比較少;設計模式
2)客戶只知道傳入工廠類的參數,對於如何建立對象(邏輯)不關心;ide
3)因爲簡單工廠很容易違反高內聚責任分配原則,所以通常只在很簡單的狀況下應用。測試
工廠類是整個模式的關鍵.包含了必要的邏輯判斷,根據外界給定的信息,決定究竟應該建立哪一個具體類的對象.經過使用工廠類,外界能夠從直接建立具體產品對象的尷尬局面擺脫出來,僅僅須要負責「消費」對象就能夠了。而沒必要管這些對象究竟如何建立及如何組織的.明確了各自的職責和權利,有利於整個軟件體系結構的優化。優化
因爲工廠類集中了全部實例的建立邏輯,違反了高內聚責任分配原則,將所有建立邏輯集中到了一個工廠類中;它所能建立的類只能是事先考慮到的,若是須要添加新的類,則就須要改變工廠類了。
當系統中的具體產品類不斷增多時候,可能會出現要求工廠類根據不一樣條件建立不一樣實例的需求.這種對條件的判斷和對具體產品類型的判斷交錯在一塊兒,很難避免模塊功能的蔓延,對系統的維護和擴展很是不利。this
//1.建立一個須要共同實現的接口 public interface Sender { public void Send(); } //2.接口實現類1:MailSender public class MailSender implements Sender { @Override public void Send() { System.out.println("this is mailsender!"); } } //3.接口實現類2:SmsSender public class SmsSender implements Sender { @Override public void Send() { System.out.println("this is sms sender!"); } } //4.工廠類 public class SendFactory { public Sender produce(String type) { if ("mail".equals(type)) { return new MailSender(); } else if ("sms".equals(type)) { return new SmsSender(); } else { System.out.println("請輸入正確的類型!"); return null; } } } //5.使用方法 public class FactoryTest { public static void main(String[] args) { SendFactory factory = new SendFactory(); Sender sender = factory.produce("sms"); sender.Send(); } } 輸出結果:this is sms sender!
是對普通工廠方法模式的改進,在普通工廠方法模式中,若是傳遞的字符串出錯,則不能正確建立對象,而多個工廠方法模式是提供多個工廠方法,分別建立對象。spa
//對以上簡單工廠類作簡單修改 public class SendFactory { public Sender produceMail(){ return new MailSender(); } public Sender produceSms(){ return new SmsSender(); } } //測試方法 public class FactoryTest { public static void main(String[] args) { SendFactory factory = new SendFactory(); Sender sender = factory.produceMail(); sender.Send(); } } 輸出結果:this is mailsender!
同多方法簡單工廠關係圖。設計
//將上面的多個工廠方法模式裏的方法置爲靜態的,不須要建立實例,直接調用 public class SendFactory { public static Sender produceMail(){ return new MailSender(); } public static Sender produceSms(){ return new SmsSender(); } } //測試方法 public class FactoryTest { public static void main(String[] args) { Sender sender = SendFactory.produceMail(); sender.Send(); } } 輸出結果:this is mailsender!