工廠方法模式(Factory Method)
簡單工廠模式有一個問題就是,類的創建依賴工廠類,也就是說,如果想要拓展程序,必須對工廠類進行修改,這違背了閉包原則,所以,從設計角度考慮,有一定的問題,如何解決?就用到工廠方法模式,創建一個工廠接口和創建多個工廠實現類,這樣一旦需要增加新的功能,直接增加新的工廠類就可以了,不需要修改之前的代碼。
請看例子:
[java] view plaincopy
- public interface Sender {
- public void Send();
- }
兩個實現類:
[java] view plaincopy
- public class MailSender implements Sender {
- @Override
- public void Send() {
- System.out.println("this is mailsender!");
- }
- }
[java] view plaincopy
- public class SmsSender implements Sender {
- @Override
- public void Send() {
- System.out.println("this is sms sender!");
- }
- }
兩個工廠類:
[java] view plaincopy
- public class SendMailFactory implements Provider {
- @Override
- public Sender produce(){
- return new MailSender();
- }
- }
[java] view plaincopy
- public class SendSmsFactory implements Provider{
- @Override
- public Sender produce() {
- return new SmsSender();
- }
- }
在提供一個接口:
[java] view plaincopy
- public interface Provider {
- public Sender produce();
- }
測試類:
[java] view plaincopy
- public class Test {
- public static void main(String[] args) {
- Provider provider = new SendMailFactory();
- Sender sender = provider.produce();
- sender.Send();
- }
- }
其實這個模式的好處就是,如果你現在想增加一個功能:發及時信息,則只需做一個實現類,實現Sender接口,同時做一個工廠類,實現Provider接口,就OK了,無需去改動現成的代碼。這樣做,拓展性較好!
2、抽象工廠模式
工廠方法模式和抽象工廠模式不好分清楚,他們的區別如下:
工廠方法模式: 一個抽象產品類,可以派生出多個具體產品類。 一個抽象工廠類,可以派生出多個具體工廠類。 每個具體工廠類只能創建一個具體產品類的實例。 抽象工廠模式: 多個抽象產品類,每個抽象產品類可以派生出多個具體產品類。 一個抽象工廠類,可以派生出多個具體工廠類。 每個具體工廠類可以創建多個具體產品類的實例,也就是創建的是一個產品線下的多個產品。 區別: 工廠方法模式只有一個抽象產品類,而抽象工廠模式有多個。 工廠方法模式的具體工廠類只能創建一個具體產品類的實例,而抽象工廠模式可以創建多個。
工廠方法創建 "一種" 產品,他的著重點在于"怎么創建",也就是說如果你開發,你的大量代碼很可能圍繞著這種產品的構造,初始化這些細節上面。也因為如此,類似的產品之間有很多可以復用的特征,所以會和模版方法相隨。
抽象工廠需要創建一些列產品,著重點在于"創建哪些"產品上,也就是說,如果你開發,你的主要任務是劃分不同差異的產品線,并且盡量保持每條產品線接口一致,從而可以從同一個抽象工廠繼承。
對于java來說,你能見到的大部分抽象工廠模式都是這樣的: ---它的里面是一堆工廠方法,每個工廠方法返回某種類型的對象。 比如說工廠可以生產鼠標和鍵盤。那么抽象工廠的實現類(它的某個具體子類)的對象都可以生產鼠標和鍵盤,但可能工廠A生產的是羅技的鍵盤和鼠標,工廠B是微軟的。 這樣A和B就是工廠,對應于抽象工廠; 每個工廠生產的鼠標和鍵盤就是產品,對應于工廠方法; 用了工廠方法模式,你替換生成鍵盤的工廠方法,就可以把鍵盤從羅技換到微軟。但是用了抽象工廠模式,你只要換家工廠,就可以同時替換鼠標和鍵盤一套。如果你要的產品有幾十個,當然用抽象工廠模式一次替換全部最方便(這個工廠會替你用相應的工廠方法) 所以說抽象工廠就像工廠,而工廠方法則像是工廠的一種產品生產線