一、工廠方法模式缺陷
工廠方法模式有一個問題就是,類的創建依賴工廠類,也就是說,如果想要拓展程序,必須修改工廠類,這違背了設計模式六大原則第一條閉包原則。
所以,從設計角度考慮,有一定的問題,如何解決?就用到抽象工廠模式,創建多個工廠類,這樣一旦需要增加新的功能,直接增加新的工廠類就可以了,不需要修改之前的代碼。
二、抽象工廠模式實現
/**
* 1、郵寄接口,有一個抽象郵寄方法待實現
* @author barnett
*
*/
public interface Sender {
public void send();
}
/**
* 2、實現類,郵件郵寄類實現郵寄接口,實現其郵寄的方法
* @author barnett
*
*/
public class MailSender implements Sender {
@Override
public void send() {
System.out.println("I am MailSender!");
}
}
/**
* 短信郵寄類實現郵寄接口,實現其郵寄方法
* @author barnett
*
*/
public class SmsSender implements Sender {
@Override
public void send() {
System.out.println("I am SmsSender!");
}
}
/**
* 3、提供器接口,返回郵寄對象,其生產方法待實現
* 工廠依靠實現該接口,生產產品(Sender)
* @author barnett
*
*/
public interface Provider {
public Sender produce();
}
/**
* 4、工廠,郵件郵寄工廠,負責專門生產郵件郵寄實例
* @author barnett
*
*/
public class SendMailFactory implements Provider {
@Override
public Sender produce() {
return new MailSender();
}
}
/**
* 短信郵寄工廠,專門生產短信郵寄實例
* @author barnett
*
*/
public class SendSmsFactory implements Provider {
@Override
public Sender produce() {
return new SmsSender();
}
}
/**
* 5、測試類
* @author barnett
*
*/
public class Test {
public static void main(String[] args) {
// 實例一個郵件工廠(因其實現了提供器接口,可返回一個具有專門生產某種產品生產方法的實例)
Provider provider = new SendMailFactory();
// 通過該實例生產產品
Sender sender = provider.produce();
// 調用產品的方法
sender.send();
// 實例生產另一種產品的工廠
SendSmsFactory factory = new SendSmsFactory();
Sender sender2 = factory.produce();
sender2.send();
}
}
三、抽象工廠模式優勢
若想生產新的產品,只需一個實現類,實現Sender接口,再創建一個專門用於生產該產品的工廠類,實現Provider接口,這樣一來,無需改動原有代碼,拓展性好。