工廠方法模式有一個問題就是,類的創建依賴於工廠類,拓展程序的話,必須修改現有的工廠類,這違背了閉包原則。抽象工廠模式,創建多個工廠類,一旦有新的功能,則只需要創建新的對象類,同時創建對應的工廠類即可。
定義發送接口
public interface Sender{
public void Send();
}
其次,創建兩個實現類,分別實現發送郵件和短信
public class MailSender implenments Sender(){
@override
public void send(){
System.out.println("this is a mail sender");
}
}
public class SmsSender implenments Sender(){
@override
public void send(){
System.out.println("this is a sms sender");
}
}
然後,創建一個藉口類,定義produce方法,用於子類實現創建對象
public interface Provider {
public Sender produce();
}
接着,針對兩個對象類,分別創建兩個工廠類
public class SendMailFactory implements Provider {
@Override
public Sender produce(){
return new MailSender();
}
}
public class SendSmsFactory implements Provider {
@Override
public Sender produce(){
return new SmsSender();
}
}
測試類
public class FactoryTest(){
public static void main(String [] args){
SendFactory factory = new
SendMailFactory();
Sender sender = factory.produce();
sender.sender();
}
}
抽象工廠模式的好處在於如果這時候需要增加一個發送及時消息的功能,不需要修改現有的工廠類,只需要重新創建一個實現類InsMegSender,實現
Sender接口,同時創建一個工廠類,實現Provider藉口即可。
新添加發送即時消息的類
public class
InsMegSender implenments Sender(){
@override
public void send(){
System.out.println("this is a InsMeg sender");
}
}
新添加即時消息的工廠類
public class SendInsMegFactory implements Provider {
@Override
public Sender produce(){
return new InsMegSender();
}
}
測試類
public class FactoryTest(){
public static void main(String [] args){
SendFactory factory = new
SendInsMegFactory();
Sender sender = factory.produce();
sender.sender();
}
}
輸出:this is a InsMeg sender
怎麼樣,感覺有點意思吧,歡迎各位大俠互相討論