設計模式(二)--- java中的工廠模式
阿新 • • 發佈:2019-01-08
工廠模式
簡單工廠模式是屬於建立型模式,又叫做靜態工廠方法(Static Factory Method)模式,但不屬於23種GOF設計模式之一。簡單工廠模式是由一個工廠物件決定創建出哪一種產品類的例項。簡單工廠模式是工廠模式家族中最簡單實用的模式,可以理解為是不同工廠模式的一個特殊實現。
一、簡單工廠模式
試想一下,當我們在寫程式碼的時候,在A類裡面只要例項化了一個B類的物件,那麼A類就會從某種程度上依賴B類。如果在後期需求發生變化或者是維護的時候,需要修改B類的時候,我們就需要開啟原始碼修改所有與這個類有關的類了,做過重構的朋友都知道,這樣的事情雖然無法完全避免,但確實是一件讓人心碎的事情。
使用發郵件和簡訊的舉例
(1)建立傳送者介面
public interface Sender {
public void Send();
}
(2)建立郵件簡訊實現類
public class MailSender implements Sender {
@Override
public void Send() {
System.out.println("郵件mailsender!");
}
}
public class SmsSender implements Sender { @Override public void Send() { System.out.println("簡訊sender!"); } }
(3)建立工廠類
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;
}
}
}
(4)測試
public class FactoryTest { public static void main(String[] args) { SendFactory factory = new SendFactory(); Sender sender = factory.produce("sms"); sender.Send(); } }
測試結果
二、工廠方法模式
是對普通工廠方法模式的改進,在普通工廠方法模式中,如果傳遞的字串出錯,則不能正確建立物件,而多個工廠方法模式是提供多個工廠方法,分別建立物件。
修改簡單工廠模式的SendFactory
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 mailSender = factory.produceMail();
Sender SmsSender = factory.produceSms();
mailSender.Send();
SmsSender.Send();
}
}
三、靜態工廠方法
將工廠方法的物件設定為靜態,不用例項化,直接呼叫。
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 mailSender = SendFactory.produceMail();
Sender SmsSender = SendFactory.produceSms();
mailSender.Send();
SmsSender.Send();
}
}
工廠模式總結
工廠模式適合場景:凡是出現了大量的產品需要建立,並且具有共同的介面時,可以通過工廠方法模式進行建立。在以上的三種模式中,第一種如果傳入的字串有誤,不能正確建立物件,第三種相對於第二種,不需要例項化工廠類,所以,大多數情況下,我們會選用第三種——靜態工廠方法模式。