Factory Method 工廠方法模式
工廠方法模式:
- 核心,定義一個創建對象的接口/抽象類,讓子類來決定實例化哪一個類,使實例化延遲到子類。
當有新的產品產生時,只要按照產品接口和工廠接口來生成,就可以被客戶端使用,而不必改碼.
所以工廠方法模式是完全符合開閉原則的。 - 工廠方法克服了簡單工廠違背開放封閉原則的缺點,又保持了封裝對象創建過程的優點。
降低了客戶程序和產品對象之間的耦合。
- 核心,定義一個創建對象的接口/抽象類,讓子類來決定實例化哪一個類,使實例化延遲到子類。
示例類圖:
示例代碼:
// 產品
public interface Sender {
public void send(String msg);
}
//具體產品
public class MailSender implements Sender {
@Override
public void send(String msg) {
System.out.println("MailSender send : " + msg);
}
}
public class SmsSender implements Sender {
@Override
public void send(String msg) {
System.out.println("SmsSender send : " + msg);
}
}
// 定義一個創建對象的接口,讓子類來決定實例化哪一個類,使實例化延遲到子類。
public interface SenderFactory {
public Sender getSender();
}
//具體工廠(每個具體工廠負責一個具體產品)
public class MailSenderFactory implements SenderFactory {
@Override
public Sender getSender() {
return new SmsSender();
}
}
public class SmsSenderFactory implements SenderFactory{
@Override
public Sender getSender() {
return new MailSender();
}
}
// 測試
public class FactoryTest {
public static void main(String[] args) {
FactoryMethod();
}
// 工廠方法模式測試
public static void FactoryMethod() {
SenderFactory senderFactory = new MailSenderFactory();
Sender sender = senderFactory.getSender();
sender.send("MailSenderFactory");
new SmsSenderFactory().getSender().send("SmsSenderFactory");
}
}
工廠方法是簡單工廠的進一步抽象和推廣,由於使用了多態性,所以每增加一個產品就要增加一個對應的產品工廠類,增加了額外的開發量。
當產品種類非常多時,就會出現大量的與之對應的工廠類,使用簡單工廠模式與工廠方法模式相結合的方式可以減少工廠類:
即對於產品樹上類似的種類(一般是樹的葉子中互爲兄弟的)使用簡單工廠模式來實現。